Repository files navigation

Bespoke

A portable agent skill that builds writing from a specific person's real voice, grounded in four established, independent bodies of research rather than a fixed list of banned phrases:

  • Stylometry and authorship attribution for what an individual's actual linguistic fingerprint consists of (function words, sentence-length variance, recurring phrase patterns), the same class of evidence used in forensic authorship analysis since the statistical study of the disputed Federalist Papers.
  • Orwell's plain-style diagnostics, from "Politics and the English Language" (1946), for a principled account of why prefabricated phrasing reads as hollow, eight decades before anything resembling AI-generated text existed.
  • Formulaic-language psycholinguistics, for why the goal is swapping shared, generic phrasing for a writer's own recurring language, not eliminating pre-formed phrasing altogether.
  • Forensic content-analysis criteria (Criteria-Based Content Analysis and Reality Monitoring) for what distinguishes genuine, specific, lived detail from plausible-sounding invention.

It is plain Markdown with zero external dependencies: no API keys, no build step, nothing to install to use it. Full sourcing for all four is in references/.

Installation

Skills CLI

Install with the cross-agent skills CLI:

npx skills add blisse-code/bespoke --global

Update an existing install:

npx skills update bespoke --global

To install into every supported agent harness on your machine:

npx skills add blisse-code/bespoke --global --agent '*'

Omit --global for a project-local install that can be committed and shared with collaborators.

Claude Code plugin

/plugin marketplace add blisse-code/bespoke
/plugin install bespoke@bespoke

The skill is then invoked as /bespoke:bespoke.

Manual

Any agent harness can use the skill directly because the runtime artifact is SKILL.md. Copy it, and the references/ folder alongside it, into wherever your harness expects skill directories:

git clone https://github.com/blisse-code/bespoke.git /path/to/your/skills/bespoke

Or, if you already have this repo cloned:

mkdir -p /path/to/your/skills/bespoke
cp -r SKILL.md references /path/to/your/skills/bespoke/

Claude.ai

Upload SKILL.md and the references/ folder as a .skill file (zip the repo, excluding .git, .github, and .claude-plugin) through Settings → Capabilities → Skills.

Usage

Invoke however your harness exposes installed skills. Common forms:

/bespoke
Write in my voice: [paste a LinkedIn post topic]
Humanize this: [paste AI-sounding text]

The skill opens with a short intake if it doesn't already know your voice, platform, audience, and intention for the piece. Voice is an explicit choice, your own style or Bespoke's default, not a request for adjectives:

Voice: own style
[paste at least 100 words of your own past writing, an essay,
article, post, or email you actually wrote]
Task: LinkedIn post about a product launch delay
Audience: my team and a few clients who are already annoyed
Intention: own the delay without sounding defensive

From a real sample like that, Bespoke reads sentence-length pattern, function-word habits, and recurring phrases (Section 1) rather than working from a self-description. The profile that comes out of one might read, in Bespoke's own shorthand, as something like "direct, a little dry, no corporate hedging", but that's Bespoke's inference from your material, not something you type in yourself. Under 100 words, it'll ask for more before building anything from it. Say Voice: default instead to skip a personal fingerprint entirely and get Sections 2 through 4's plain-style discipline without one.

Before / after example 1: structural and typographic tells

(Illustration note: the "before" is a representative generic-AI-written passage, not a real product announcement. The "after" applies the voice profile from the intake example above, direct, a little dry, no corporate hedging, and adds a few concrete specifics, like "three teams asked" and "check Settings," that stand in for the kind of real detail a user would supply in an actual session. Bespoke doesn't invent those in practice; it asks for them or leaves the sentence plain. See Section 4's specificity test.)

Before (generic AI-written text):

🚀 Introducing Smart Scheduling: A Game-Changer for Your Workflow

We're thrilled to announce the launch of Smart Scheduling, a feature that stands as a testament to our commitment to innovation, efficiency, and user delight. This pivotal update marks a key turning point in our platform's evolving landscape.

Intelligent Automation: Intelligent automation ensures your calendar stays perfectly organized. Seamless Integration: Seamless integration means Smart Scheduling works effortlessly with the tools you already love. Real-Time Sync: Real-time sync keeps everyone — teammates, clients, and stakeholders — on the exact same page.

In order to fully leverage this robust new capability, users simply need to enable it in Settings. It could potentially possibly make a meaningful difference for teams juggling multiple calendars.

Additionally, Smart Scheduling isn't just a tool — it's a philosophy. It's not about saving time, it's about giving that time back to what truly matters. Whether you're a solo founder, a growing startup, or an established enterprise, Smart Scheduling has something for everyone.

We hope this helps streamline your day! Let us know if you have any questions — we'd love to hear from you. 🎉

Overall, we're incredibly excited about what this means for the future. The road ahead looks bright, and we can't wait to see what you build next.

After (Bespoke rewrite):

Smart Scheduling is live. Check Settings to turn it on.

It syncs your calendar with the tools you're already using, so teammates, clients, and anyone else on the invite are looking at the same times. No import step, no separate app to check.

We built it because three teams asked for the same thing in one month: stop making them reconcile two calendars by hand. If that's not your problem, you probably won't notice this update, and that's fine.

Turn it on and tell us what breaks.

Every pattern in the "before" maps to a specific rule this skill applies: the heading trades Title Case and an emoji for plain sentence case with no decoration; "stands as a testament to... innovation, efficiency, and user delight" (a dying metaphor stacked with rule-of-three padding) becomes nothing, because the fact that the feature exists doesn't need a legacy claim; the bolded inline-header list collapses into two plain sentences; "in order to fully leverage this robust... capability" (a filler phrase plus pretentious diction) becomes "so"; "could potentially possibly" (stacked hedging) becomes a specific, sourced reason instead of a hedge; the em dashes are gone; and the closing "Overall, we're incredibly excited..." (a generic positive conclusion) is replaced by an actual next step. See Coverage below for where each pattern lives in the skill.

Before / after example 2: voice and specificity, layered with a fixed personal-voice skill

The first example shows structural and typographic tells getting removed from a formatted document. This one shows the other half of the skill, Sections 1 and 4, working on a short, unformatted personal narrative, and demonstrates Section 8: layering Bespoke under a separate, fixed personal-voice skill rather than using Bespoke's generic defaults.

(Illustration note: this is a fictional narrative written to demonstrate the skill, not a real account, and doesn't depict any real, identifiable person. The "before" is a short, deliberately generic AI-written passage. For the "after," Bespoke's own intake (Section "The intake") was pre-filled per Section 8 by an existing fixed-voice skill, no em dashes, zero cap on unsupported facts, an "acid test" against real named entities, burstiness, grade 6-7 readability, restrained tone, no performed vulnerability, a quiet close over a dramatic one, rather than by a fresh sample. The specific narrative details below, the street name, the dialogue, the dead flash, are illustrative texture standing in for what a real user's own material would supply; see Section 4's specificity test for why a rewrite shouldn't invent this kind of detail about something that actually happened.)

Before (generic AI-written text, 199 characters):

Nestled in the vibrant heart of Kuala Lumpur, an unofficial date with a stunning model blossomed into an unforgettable, impromptu photoshoot, a testament to genuine chemistry and effortless artistry.

After (Bespoke rewrite, voice layered from a fixed personal-voice skill):

Met her at a rooftop bar off Jalan Alor on a Tuesday, the kind of humid Kuala Lumpur night that turns any jacket into a mistake by nine. She modeled part-time, she said, mostly for local streetwear brands. I brought a camera out of habit, not intent.

Two drinks in, she picked it up, turned it over, and said, "so are you going to use this or just carry it around."

We ended up on the street outside for maybe twenty minutes, I didn't check. Streetlights and a wet road did most of the work. My flash died halfway through. Neither of us minded.

What changed and why: "nestled in the vibrant heart of," "blossomed into," and "a testament to genuine chemistry and effortless artistry" (Fault 1's dying metaphors and promotional-language sub-family) are gone entirely rather than trimmed, because the plain fact underneath them, two people met, ended up taking pictures, doesn't need a frame telling the reader how to feel about it. In their place: a specific street and night (Section 4's contextual embedding), reproduced dialogue instead of summary ("she asked about the camera" would be the generic version), an unexpected complication a smooth invented account wouldn't think to include (the dead flash), and an admitted gap ("I didn't check") rather than false precision. Sentence length varies sharply, one long scene-setting sentence, then short and medium ones, per the layered skill's burstiness rule and Section 9's presence principle, rather than settling into the uniform mid-length rhythm generated text defaults to. Zero em dashes, per both the layered skill's hard rule and Section 1's typographic default. The close is a flat, quiet fact instead of a generic positive conclusion (Cluster D), which is the layered skill's own "solution is the hero, not the victim" instinct doing the same work Section 9 asks for from a different direction.

What it does

  • An explicit own-style-or-default choice, not a default assumption. Choosing your own style requires a real writing sample of at least 100 words, an essay, article, post, or email you actually wrote; under that, the skill says so and asks for more rather than guessing from a fragment. Adjectives alone ("direct, a little dry") don't satisfy either path. Choosing default skips the personal fingerprint and keeps every plain-style and typographic default in force.
  • A stylometric voice fingerprint, not a one-shot style match: function-word habits, sentence-length variance, opening patterns, and the writer's own recurring bigrams and trigrams, read from a real sample and kept for the rest of the conversation.
  • Orwell's plain-style check, applied as a live diagnostic: dying metaphors, verbal false limbs, pretentious diction, and meaningless words, the same four faults named in 1946, with current examples.
  • Five clusters of structural patterns beyond Orwell's essay: borrowed authority, decorative structure, borrowed register, hedging and throat-clearing, and mechanical uniformity, covering everything from significance inflation and promotional language to stacked hedging, throat-clearing openers, and uniform transition-word rotation across a whole document. See Coverage below for the full pattern list.
  • A hard zero-default on em and en dashes, not just "use sparingly": the finished draft is scanned for , , and their spaced/doubled-hyphen equivalents before delivery, unless a real voice sample shows the writer actually uses them, in which case the sample wins outright.
  • A formulaic-language swap, not a ban. Pre-formed phrasing is normal and necessary for fluent writing; the skill directs it toward the writer's own recurring phrases instead of shared clichés.
  • A specificity test drawn from forensic content analysis: contextual embedding, unexpected complications, reproduced (not summarized) conversation, and admitted gaps, the actual criteria used to distinguish genuine accounts from fabricated ones, repurposed as a construction checklist.
  • Presence, not just absence. Stripping every flagged pattern out and putting nothing back produces sterile prose, a different failure with the same symptom. Once a voice fingerprint exists, the skill writes toward it: uneven rhythm, real stance, unresolved mixed feelings, genuine self-correction, gated by content type and bounded by the no-fabrication rule throughout.
  • Platform-specific structure: Context-Core-Connect for LinkedIn and Substack, hook-plus-white-space for X and Threads, tight distillation for email and Slack.
  • Three invocation modes: pasted text (draft plus notes on what changed), file mode (rewrites a file in place, prose only), and embedded mode (bare final text for another agent or task using this skill as one step of a larger job).
  • An honest engagement gate. Rapport techniques that work by being honest are always available. Techniques that work by deceiving the reader are gated to disclosed, consensual contexts, not applied by default to published, audience-facing content. See references/engagement-ethics.md.
  • Verified detection science, not fabricated statistics.references/detection-science.md documents a citation-fabrication finding caught and excluded during research, and why current classifier-based detectors make surface-level evasion a weaker strategy than genuine specificity.

Coverage against Wikipedia's "Signs of AI writing" guide

The primary source for Bespoke's pattern taxonomy is Wikipedia's "Signs of AI writing" guide, maintained by WikiProject AI Cleanup from real examples observed across Wikipedia articles, drafts, and comments. See References below. That guide is broader than Bespoke's scope in one direction, it documents Wikipedia-specific markup and citation mechanics (broken wikitext, invalid DOIs, utm_source parameters, non-existent templates, skipped heading levels, and similar), none of which apply to general prose and none of which Bespoke checks. The table below covers the guide's Content, Language and Grammar, Style, and Communication sections, the parts that generalize to any writing, and where each lives in Bespoke.

The guide's general-prose patterns, and where they live in Bespoke

Wikipedia's patternWhere it lives in Bespoke
Undue emphasis on significance, legacy, and broader trendsplain-style-diagnostics.md, Fault 1, "Significance and legacy inflation"
Canned emphasis on notability, attribution, and media coverageplain-style-diagnostics.md, Cluster A, "Notability namedropping"
Superficial analysesplain-style-diagnostics.md, "Padding at the paragraph level"
Promotional and advertisement-like languageplain-style-diagnostics.md, Fault 1, "Promotional and brochure language"
Vague attributions and overgeneralization of opinionsplain-style-diagnostics.md, Cluster A, "Vague attribution"
Outline-like conclusions about challenges and future prospectsplain-style-diagnostics.md, "Padding at the paragraph level"
High density of "AI vocabulary" wordsplain-style-diagnostics.md, Fault 3, tied to SKILL.md Section 1's frequency framing
Avoidance of basic copulatives ("is"/"are")plain-style-diagnostics.md, Cluster B, "Copula avoidance"
Negative parallelisms (three subtypes)plain-style-diagnostics.md, Cluster B
Rule of threeplain-style-diagnostics.md, Cluster B
Lexical diversity / elegant variationplain-style-diagnostics.md, Cluster B, "Synonym cycling"
Title casetypographic-markers.md
Overuse of boldfacetypographic-markers.md
Inline-header vertical liststypographic-markers.md
Overuse of em dashestypographic-markers.md — hard zero-default, not "use sparingly"
Emoji as formattingtypographic-markers.md
Curly quotation markstypographic-markers.md
Collaborative communicationplain-style-diagnostics.md, Cluster C, "Chatbot artifacts"
Knowledge-cutoff disclaimersSKILL.md Section 4, folded into the specificity test rather than a word list
Phrasal templates and placeholder textSKILL.md Section 4, the specificity test's placeholder guidance

A few of the guide's Style-section items are Wikipedia-article conventions with no general-prose analog (title-heading formatting, skipped heading levels, level-1-heading overuse, thematic breaks between sections, unusual table use) and aren't in the table above for that reason, not because they're uncovered by oversight.

Patterns and features Bespoke has beyond the Wikipedia guide

  • Definitional throat-clearing openers ("X refers to..." used to warm up a paragraph before the real point) — plain-style-diagnostics.md, Cluster D.
  • Recap and meta-commentary closings ("In summary," "to conclude," restating what a piece already said) — Cluster D.
  • Uniform transition-word rotation (mechanically cycling However / Moreover / Furthermore / Additionally across paragraphs) — Cluster E.
  • Structural symmetry addiction (every section forced to the same paragraph count regardless of what the content needs) — Cluster E.
  • Frequency-based AI-vocabulary detection tied to stylometry. The wider AI-vocabulary list under Fault 3 is explicitly framed as an anomalous-rate signal connected to SKILL.md Section 1's function-word fingerprinting, not a flat banned-word list, so a single instance of a listed word isn't treated as a violation on its own.
  • Presence, not just absence (SKILL.md Section 9). Removing every flagged pattern and adding nothing back is a different failure with the same symptom as generated prose. Once a voice fingerprint exists, the skill actively writes toward it: uneven rhythm, real stance, unresolved mixed feelings, genuine self-correction, bounded by the no-fabrication rule throughout.
  • A stylometric voice fingerprint built from a real sample, kept and updated across a whole conversation rather than applied once per rewrite (SKILL.md Section 1), grounded in the same authorship-attribution research used in forensic linguistics.
  • A specificity test from forensic content-analysis criteria (CBCA, Reality Monitoring) for distinguishing genuine detail from plausible-sounding invention, not just an AI-tell scan (SKILL.md Section 4).
  • An honest-engagement gate on rapport techniques that work by deceiving the reader, restricted to disclosed, consensual contexts rather than applied by default (references/engagement-ethics.md).
  • Verified, sourced detection science, including a documented citation-fabrication finding caught and excluded during this project's own research (references/detection-science.md).

Repository structure

bespoke/
├── SKILL.md # the skill itself; source of truth
├── README.md # this file
├── AGENTS.md # guidance for agents/contributors editing this repo
├── LICENSE # MIT
├── .claude-plugin/
│ ├── plugin.json # Claude Code plugin manifest
│ └── marketplace.json # single-repo marketplace entry
├── .github/workflows/validate.yml # CI: runs the same checks below on every push
├── scripts/
│ └── validate_package.py # dependency-free sync checks (stdlib only)
└── references/
├── plain-style-diagnostics.md
├── typographic-markers.md
├── detection-science.md
├── engagement-ethics.md
└── changelog.md

Validating a local copy

python3 scripts/validate_package.py

Stdlib only, no pip install required. Checks that SKILL.md's name and version match .claude-plugin/plugin.json, that every file SKILL.md points to under references/ actually exists, and that the marketplace entry resolves.

Version history

  • 2.4.0 — Corrected the pattern taxonomy's primary-source attribution: references/plain-style-diagnostics.md's Clusters A through C now cite Wikipedia's "Signs of AI writing" guide directly, verified against the live page, rather than being attributed by way of blader/humanizer, which is itself downstream of that same guide. New README "References" section citing the Wikipedia guide and WikiProject AI Cleanup, its maintaining organization, without claiming any project affiliation beyond citation. The "Coverage" section is rebuilt against the guide's own Content, Language and Grammar, Style, and Communication sections (with its Wikipedia-specific markup and citation items explicitly noted as out of scope) rather than humanizer's numbered list. blader/humanizer now appears only in Credits, as the tool early development was benchmarked against. See references/changelog.md.
  • 2.3.0 — Made the Voice intake an explicit own-style-or-default choice rather than a default sample-or-adjectives request. Choosing own style now requires a real writing sample of at least 100 words, with an explicit ask for more if under that floor; adjectives alone no longer satisfy either path. Choosing default explicitly waives a personal fingerprint while keeping every plain-style and typographic default in force. New "The own-style-or-default gate" subsection in SKILL.md Section 1; intake item 1 and the Usage/"What it does" sections of this README updated to match. No change to any pattern in plain-style-diagnostics.md or typographic-markers.md. See references/changelog.md.
  • 2.2.1 — Added "Before / after example 2" to this README: a short, fictional, non-identifying personal narrative run through the installed skill with Voice pre-filled by a separate fixed personal-voice skill per Section 8, demonstrating Sections 1 and 4 (voice fingerprint, specificity test) on unformatted prose rather than the mostly structural/typographic first example. README-only; no change to SKILL.md or any pattern file. See references/changelog.md.
  • 2.2.0 — Full audit against blader/humanizer v2.9.1's complete 33-pattern taxonomy (see Coverage above). Closed every remaining gap: significance/legacy inflation and promotional/brochure language (Fault 1), the full high-frequency AI-vocabulary list tied to Section 1's stylometry framing (Fault 3), passive voice and subjectless fragments as a named pattern (Fault 2), filler phrases as an explicit stock list (Fault 2), and two new clusters, D (hedging, throat-clearing, and empty closes) and E (mechanical uniformity), the latter with no equivalent in humanizer's taxonomy. Hardened the em-dash default from "rare" to a zero-default with a pre-delivery scan, matching humanizer's hard-constraint treatment while keeping the sample-override principle. Added SKILL.md Section 9 ("Presence, not just absence") on actively writing toward the voice fingerprint rather than only scrubbing tells, Section 10 (invocation modes: pasted text, file, embedded), and an explicit two-question self-audit step in the Application workflow. Expanded plain-style-diagnostics.md's false-positive guidance from 4 items to 15. Added a before/after example and the coverage table above to this README. See references/changelog.md for the full audit account.
  • 2.1.0 — Closed a coverage gap found during a direct comparison against the tool this skill was originally benchmarked against: added typography and formatting as voice-fingerprint markers (references/typographic-markers.md) and three clusters of structural patterns (borrowed authority, decorative structure, borrowed register) to references/plain-style-diagnostics.md. Also fixed a stale internal section cross-reference. See references/changelog.md for the specific patterns added and why each was placed where it was.
  • 2.0.0 — Rebuilt around independent research (stylometry, Orwell's plain-style diagnostics, formulaic-language psycholinguistics, forensic content-analysis criteria) rather than a comparative audit of an existing tool. See references/changelog.md for the full account of what changed and why.
  • 1.0.0 — Initial release, built after benchmarking against an existing AI-tell removal tool. Superseded by 2.0.0's independent research base.

License

MIT. See LICENSE.

References

  • Wikipedia: Signs of AI writing — primary source for the pattern taxonomy in references/plain-style-diagnostics.md's Clusters A through C and references/typographic-markers.md. See Coverage above for the section-by-section mapping.
  • WikiProject AI Cleanup — the Wikipedia project that maintains the guide above.

Credits

Early development benchmarked against blader/humanizer (MIT), an existing open-source AI-tell removal skill that itself cites the Wikipedia guide above as its own primary source. Bespoke's current structure is built from independent research (see references/changelog.md); this credit reflects where the project started, not its present design or its present sourcing.

About

Agent skill that helps you mold AI-generated writing into your own authentic voice, grounded in stylometry, plain-style principles, and forensic content analysis.

Topics

Resources

Stars

1 star

Watchers

0 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

Repository files navigation

Bespoke

A portable agent skill that builds writing from a specific person's real voice, grounded in four established, independent bodies of research rather than a fixed list of banned phrases:

  • Stylometry and authorship attribution for what an individual's actual linguistic fingerprint consists of (function words, sentence-length variance, recurring phrase patterns), the same class of evidence used in forensic authorship analysis since the statistical study of the disputed Federalist Papers.
  • Orwell's plain-style diagnostics, from "Politics and the English Language" (1946), for a principled account of why prefabricated phrasing reads as hollow, eight decades before anything resembling AI-generated text existed.
  • Formulaic-language psycholinguistics, for why the goal is swapping shared, generic phrasing for a writer's own recurring language, not eliminating pre-formed phrasing altogether.
  • Forensic content-analysis criteria (Criteria-Based Content Analysis and Reality Monitoring) for what distinguishes genuine, specific, lived detail from plausible-sounding invention.

It is plain Markdown with zero external dependencies: no API keys, no build step, nothing to install to use it. Full sourcing for all four is in references/.

Installation

Skills CLI

Install with the cross-agent skills CLI:

npx skills add blisse-code/bespoke --global

Update an existing install:

npx skills update bespoke --global

To install into every supported agent harness on your machine:

npx skills add blisse-code/bespoke --global --agent '*'

Omit --global for a project-local install that can be committed and shared with collaborators.

Claude Code plugin

/plugin marketplace add blisse-code/bespoke
/plugin install bespoke@bespoke

The skill is then invoked as /bespoke:bespoke.

Manual

Any agent harness can use the skill directly because the runtime artifact is SKILL.md. Copy it, and the references/ folder alongside it, into wherever your harness expects skill directories:

git clone https://github.com/blisse-code/bespoke.git /path/to/your/skills/bespoke

Or, if you already have this repo cloned:

mkdir -p /path/to/your/skills/bespoke
cp -r SKILL.md references /path/to/your/skills/bespoke/

Claude.ai

Upload SKILL.md and the references/ folder as a .skill file (zip the repo, excluding .git, .github, and .claude-plugin) through Settings → Capabilities → Skills.

Usage

Invoke however your harness exposes installed skills. Common forms:

/bespoke
Write in my voice: [paste a LinkedIn post topic]
Humanize this: [paste AI-sounding text]

The skill opens with a short intake if it doesn't already know your voice, platform, audience, and intention for the piece. Voice is an explicit choice, your own style or Bespoke's default, not a request for adjectives:

Voice: own style
[paste at least 100 words of your own past writing, an essay,
article, post, or email you actually wrote]
Task: LinkedIn post about a product launch delay
Audience: my team and a few clients who are already annoyed
Intention: own the delay without sounding defensive

From a real sample like that, Bespoke reads sentence-length pattern, function-word habits, and recurring phrases (Section 1) rather than working from a self-description. The profile that comes out of one might read, in Bespoke's own shorthand, as something like "direct, a little dry, no corporate hedging", but that's Bespoke's inference from your material, not something you type in yourself. Under 100 words, it'll ask for more before building anything from it. Say Voice: default instead to skip a personal fingerprint entirely and get Sections 2 through 4's plain-style discipline without one.

Before / after example 1: structural and typographic tells

(Illustration note: the "before" is a representative generic-AI-written passage, not a real product announcement. The "after" applies the voice profile from the intake example above, direct, a little dry, no corporate hedging, and adds a few concrete specifics, like "three teams asked" and "check Settings," that stand in for the kind of real detail a user would supply in an actual session. Bespoke doesn't invent those in practice; it asks for them or leaves the sentence plain. See Section 4's specificity test.)

Before (generic AI-written text):

🚀 Introducing Smart Scheduling: A Game-Changer for Your Workflow

We're thrilled to announce the launch of Smart Scheduling, a feature that stands as a testament to our commitment to innovation, efficiency, and user delight. This pivotal update marks a key turning point in our platform's evolving landscape.

Intelligent Automation: Intelligent automation ensures your calendar stays perfectly organized. Seamless Integration: Seamless integration means Smart Scheduling works effortlessly with the tools you already love. Real-Time Sync: Real-time sync keeps everyone — teammates, clients, and stakeholders — on the exact same page.

In order to fully leverage this robust new capability, users simply need to enable it in Settings. It could potentially possibly make a meaningful difference for teams juggling multiple calendars.

Additionally, Smart Scheduling isn't just a tool — it's a philosophy. It's not about saving time, it's about giving that time back to what truly matters. Whether you're a solo founder, a growing startup, or an established enterprise, Smart Scheduling has something for everyone.

We hope this helps streamline your day! Let us know if you have any questions — we'd love to hear from you. 🎉

Overall, we're incredibly excited about what this means for the future. The road ahead looks bright, and we can't wait to see what you build next.

After (Bespoke rewrite):

Smart Scheduling is live. Check Settings to turn it on.

It syncs your calendar with the tools you're already using, so teammates, clients, and anyone else on the invite are looking at the same times. No import step, no separate app to check.

We built it because three teams asked for the same thing in one month: stop making them reconcile two calendars by hand. If that's not your problem, you probably won't notice this update, and that's fine.

Turn it on and tell us what breaks.

Every pattern in the "before" maps to a specific rule this skill applies: the heading trades Title Case and an emoji for plain sentence case with no decoration; "stands as a testament to... innovation, efficiency, and user delight" (a dying metaphor stacked with rule-of-three padding) becomes nothing, because the fact that the feature exists doesn't need a legacy claim; the bolded inline-header list collapses into two plain sentences; "in order to fully leverage this robust... capability" (a filler phrase plus pretentious diction) becomes "so"; "could potentially possibly" (stacked hedging) becomes a specific, sourced reason instead of a hedge; the em dashes are gone; and the closing "Overall, we're incredibly excited..." (a generic positive conclusion) is replaced by an actual next step. See Coverage below for where each pattern lives in the skill.

Before / after example 2: voice and specificity, layered with a fixed personal-voice skill

The first example shows structural and typographic tells getting removed from a formatted document. This one shows the other half of the skill, Sections 1 and 4, working on a short, unformatted personal narrative, and demonstrates Section 8: layering Bespoke under a separate, fixed personal-voice skill rather than using Bespoke's generic defaults.

(Illustration note: this is a fictional narrative written to demonstrate the skill, not a real account, and doesn't depict any real, identifiable person. The "before" is a short, deliberately generic AI-written passage. For the "after," Bespoke's own intake (Section "The intake") was pre-filled per Section 8 by an existing fixed-voice skill, no em dashes, zero cap on unsupported facts, an "acid test" against real named entities, burstiness, grade 6-7 readability, restrained tone, no performed vulnerability, a quiet close over a dramatic one, rather than by a fresh sample. The specific narrative details below, the street name, the dialogue, the dead flash, are illustrative texture standing in for what a real user's own material would supply; see Section 4's specificity test for why a rewrite shouldn't invent this kind of detail about something that actually happened.)

Before (generic AI-written text, 199 characters):

Nestled in the vibrant heart of Kuala Lumpur, an unofficial date with a stunning model blossomed into an unforgettable, impromptu photoshoot, a testament to genuine chemistry and effortless artistry.

After (Bespoke rewrite, voice layered from a fixed personal-voice skill):

Met her at a rooftop bar off Jalan Alor on a Tuesday, the kind of humid Kuala Lumpur night that turns any jacket into a mistake by nine. She modeled part-time, she said, mostly for local streetwear brands. I brought a camera out of habit, not intent.

Two drinks in, she picked it up, turned it over, and said, "so are you going to use this or just carry it around."

We ended up on the street outside for maybe twenty minutes, I didn't check. Streetlights and a wet road did most of the work. My flash died halfway through. Neither of us minded.

What changed and why: "nestled in the vibrant heart of," "blossomed into," and "a testament to genuine chemistry and effortless artistry" (Fault 1's dying metaphors and promotional-language sub-family) are gone entirely rather than trimmed, because the plain fact underneath them, two people met, ended up taking pictures, doesn't need a frame telling the reader how to feel about it. In their place: a specific street and night (Section 4's contextual embedding), reproduced dialogue instead of summary ("she asked about the camera" would be the generic version), an unexpected complication a smooth invented account wouldn't think to include (the dead flash), and an admitted gap ("I didn't check") rather than false precision. Sentence length varies sharply, one long scene-setting sentence, then short and medium ones, per the layered skill's burstiness rule and Section 9's presence principle, rather than settling into the uniform mid-length rhythm generated text defaults to. Zero em dashes, per both the layered skill's hard rule and Section 1's typographic default. The close is a flat, quiet fact instead of a generic positive conclusion (Cluster D), which is the layered skill's own "solution is the hero, not the victim" instinct doing the same work Section 9 asks for from a different direction.

What it does

  • An explicit own-style-or-default choice, not a default assumption. Choosing your own style requires a real writing sample of at least 100 words, an essay, article, post, or email you actually wrote; under that, the skill says so and asks for more rather than guessing from a fragment. Adjectives alone ("direct, a little dry") don't satisfy either path. Choosing default skips the personal fingerprint and keeps every plain-style and typographic default in force.
  • A stylometric voice fingerprint, not a one-shot style match: function-word habits, sentence-length variance, opening patterns, and the writer's own recurring bigrams and trigrams, read from a real sample and kept for the rest of the conversation.
  • Orwell's plain-style check, applied as a live diagnostic: dying metaphors, verbal false limbs, pretentious diction, and meaningless words, the same four faults named in 1946, with current examples.
  • Five clusters of structural patterns beyond Orwell's essay: borrowed authority, decorative structure, borrowed register, hedging and throat-clearing, and mechanical uniformity, covering everything from significance inflation and promotional language to stacked hedging, throat-clearing openers, and uniform transition-word rotation across a whole document. See Coverage below for the full pattern list.
  • A hard zero-default on em and en dashes, not just "use sparingly": the finished draft is scanned for , , and their spaced/doubled-hyphen equivalents before delivery, unless a real voice sample shows the writer actually uses them, in which case the sample wins outright.
  • A formulaic-language swap, not a ban. Pre-formed phrasing is normal and necessary for fluent writing; the skill directs it toward the writer's own recurring phrases instead of shared clichés.
  • A specificity test drawn from forensic content analysis: contextual embedding, unexpected complications, reproduced (not summarized) conversation, and admitted gaps, the actual criteria used to distinguish genuine accounts from fabricated ones, repurposed as a construction checklist.
  • Presence, not just absence. Stripping every flagged pattern out and putting nothing back produces sterile prose, a different failure with the same symptom. Once a voice fingerprint exists, the skill writes toward it: uneven rhythm, real stance, unresolved mixed feelings, genuine self-correction, gated by content type and bounded by the no-fabrication rule throughout.
  • Platform-specific structure: Context-Core-Connect for LinkedIn and Substack, hook-plus-white-space for X and Threads, tight distillation for email and Slack.
  • Three invocation modes: pasted text (draft plus notes on what changed), file mode (rewrites a file in place, prose only), and embedded mode (bare final text for another agent or task using this skill as one step of a larger job).
  • An honest engagement gate. Rapport techniques that work by being honest are always available. Techniques that work by deceiving the reader are gated to disclosed, consensual contexts, not applied by default to published, audience-facing content. See references/engagement-ethics.md.
  • Verified detection science, not fabricated statistics.references/detection-science.md documents a citation-fabrication finding caught and excluded during research, and why current classifier-based detectors make surface-level evasion a weaker strategy than genuine specificity.

Coverage against Wikipedia's "Signs of AI writing" guide

The primary source for Bespoke's pattern taxonomy is Wikipedia's "Signs of AI writing" guide, maintained by WikiProject AI Cleanup from real examples observed across Wikipedia articles, drafts, and comments. See References below. That guide is broader than Bespoke's scope in one direction, it documents Wikipedia-specific markup and citation mechanics (broken wikitext, invalid DOIs, utm_source parameters, non-existent templates, skipped heading levels, and similar), none of which apply to general prose and none of which Bespoke checks. The table below covers the guide's Content, Language and Grammar, Style, and Communication sections, the parts that generalize to any writing, and where each lives in Bespoke.

The guide's general-prose patterns, and where they live in Bespoke

Wikipedia's patternWhere it lives in Bespoke
Undue emphasis on significance, legacy, and broader trendsplain-style-diagnostics.md, Fault 1, "Significance and legacy inflation"
Canned emphasis on notability, attribution, and media coverageplain-style-diagnostics.md, Cluster A, "Notability namedropping"
Superficial analysesplain-style-diagnostics.md, "Padding at the paragraph level"
Promotional and advertisement-like languageplain-style-diagnostics.md, Fault 1, "Promotional and brochure language"
Vague attributions and overgeneralization of opinionsplain-style-diagnostics.md, Cluster A, "Vague attribution"
Outline-like conclusions about challenges and future prospectsplain-style-diagnostics.md, "Padding at the paragraph level"
High density of "AI vocabulary" wordsplain-style-diagnostics.md, Fault 3, tied to SKILL.md Section 1's frequency framing
Avoidance of basic copulatives ("is"/"are")plain-style-diagnostics.md, Cluster B, "Copula avoidance"
Negative parallelisms (three subtypes)plain-style-diagnostics.md, Cluster B
Rule of threeplain-style-diagnostics.md, Cluster B
Lexical diversity / elegant variationplain-style-diagnostics.md, Cluster B, "Synonym cycling"
Title casetypographic-markers.md
Overuse of boldfacetypographic-markers.md
Inline-header vertical liststypographic-markers.md
Overuse of em dashestypographic-markers.md — hard zero-default, not "use sparingly"
Emoji as formattingtypographic-markers.md
Curly quotation markstypographic-markers.md
Collaborative communicationplain-style-diagnostics.md, Cluster C, "Chatbot artifacts"
Knowledge-cutoff disclaimersSKILL.md Section 4, folded into the specificity test rather than a word list
Phrasal templates and placeholder textSKILL.md Section 4, the specificity test's placeholder guidance

A few of the guide's Style-section items are Wikipedia-article conventions with no general-prose analog (title-heading formatting, skipped heading levels, level-1-heading overuse, thematic breaks between sections, unusual table use) and aren't in the table above for that reason, not because they're uncovered by oversight.

Patterns and features Bespoke has beyond the Wikipedia guide

  • Definitional throat-clearing openers ("X refers to..." used to warm up a paragraph before the real point) — plain-style-diagnostics.md, Cluster D.
  • Recap and meta-commentary closings ("In summary," "to conclude," restating what a piece already said) — Cluster D.
  • Uniform transition-word rotation (mechanically cycling However / Moreover / Furthermore / Additionally across paragraphs) — Cluster E.
  • Structural symmetry addiction (every section forced to the same paragraph count regardless of what the content needs) — Cluster E.
  • Frequency-based AI-vocabulary detection tied to stylometry. The wider AI-vocabulary list under Fault 3 is explicitly framed as an anomalous-rate signal connected to SKILL.md Section 1's function-word fingerprinting, not a flat banned-word list, so a single instance of a listed word isn't treated as a violation on its own.
  • Presence, not just absence (SKILL.md Section 9). Removing every flagged pattern and adding nothing back is a different failure with the same symptom as generated prose. Once a voice fingerprint exists, the skill actively writes toward it: uneven rhythm, real stance, unresolved mixed feelings, genuine self-correction, bounded by the no-fabrication rule throughout.
  • A stylometric voice fingerprint built from a real sample, kept and updated across a whole conversation rather than applied once per rewrite (SKILL.md Section 1), grounded in the same authorship-attribution research used in forensic linguistics.
  • A specificity test from forensic content-analysis criteria (CBCA, Reality Monitoring) for distinguishing genuine detail from plausible-sounding invention, not just an AI-tell scan (SKILL.md Section 4).
  • An honest-engagement gate on rapport techniques that work by deceiving the reader, restricted to disclosed, consensual contexts rather than applied by default (references/engagement-ethics.md).
  • Verified, sourced detection science, including a documented citation-fabrication finding caught and excluded during this project's own research (references/detection-science.md).

Repository structure

bespoke/
├── SKILL.md # the skill itself; source of truth
├── README.md # this file
├── AGENTS.md # guidance for agents/contributors editing this repo
├── LICENSE # MIT
├── .claude-plugin/
│ ├── plugin.json # Claude Code plugin manifest
│ └── marketplace.json # single-repo marketplace entry
├── .github/workflows/validate.yml # CI: runs the same checks below on every push
├── scripts/
│ └── validate_package.py # dependency-free sync checks (stdlib only)
└── references/
├── plain-style-diagnostics.md
├── typographic-markers.md
├── detection-science.md
├── engagement-ethics.md
└── changelog.md

Validating a local copy

python3 scripts/validate_package.py

Stdlib only, no pip install required. Checks that SKILL.md's name and version match .claude-plugin/plugin.json, that every file SKILL.md points to under references/ actually exists, and that the marketplace entry resolves.

Version history

  • 2.4.0 — Corrected the pattern taxonomy's primary-source attribution: references/plain-style-diagnostics.md's Clusters A through C now cite Wikipedia's "Signs of AI writing" guide directly, verified against the live page, rather than being attributed by way of blader/humanizer, which is itself downstream of that same guide. New README "References" section citing the Wikipedia guide and WikiProject AI Cleanup, its maintaining organization, without claiming any project affiliation beyond citation. The "Coverage" section is rebuilt against the guide's own Content, Language and Grammar, Style, and Communication sections (with its Wikipedia-specific markup and citation items explicitly noted as out of scope) rather than humanizer's numbered list. blader/humanizer now appears only in Credits, as the tool early development was benchmarked against. See references/changelog.md.
  • 2.3.0 — Made the Voice intake an explicit own-style-or-default choice rather than a default sample-or-adjectives request. Choosing own style now requires a real writing sample of at least 100 words, with an explicit ask for more if under that floor; adjectives alone no longer satisfy either path. Choosing default explicitly waives a personal fingerprint while keeping every plain-style and typographic default in force. New "The own-style-or-default gate" subsection in SKILL.md Section 1; intake item 1 and the Usage/"What it does" sections of this README updated to match. No change to any pattern in plain-style-diagnostics.md or typographic-markers.md. See references/changelog.md.
  • 2.2.1 — Added "Before / after example 2" to this README: a short, fictional, non-identifying personal narrative run through the installed skill with Voice pre-filled by a separate fixed personal-voice skill per Section 8, demonstrating Sections 1 and 4 (voice fingerprint, specificity test) on unformatted prose rather than the mostly structural/typographic first example. README-only; no change to SKILL.md or any pattern file. See references/changelog.md.
  • 2.2.0 — Full audit against blader/humanizer v2.9.1's complete 33-pattern taxonomy (see Coverage above). Closed every remaining gap: significance/legacy inflation and promotional/brochure language (Fault 1), the full high-frequency AI-vocabulary list tied to Section 1's stylometry framing (Fault 3), passive voice and subjectless fragments as a named pattern (Fault 2), filler phrases as an explicit stock list (Fault 2), and two new clusters, D (hedging, throat-clearing, and empty closes) and E (mechanical uniformity), the latter with no equivalent in humanizer's taxonomy. Hardened the em-dash default from "rare" to a zero-default with a pre-delivery scan, matching humanizer's hard-constraint treatment while keeping the sample-override principle. Added SKILL.md Section 9 ("Presence, not just absence") on actively writing toward the voice fingerprint rather than only scrubbing tells, Section 10 (invocation modes: pasted text, file, embedded), and an explicit two-question self-audit step in the Application workflow. Expanded plain-style-diagnostics.md's false-positive guidance from 4 items to 15. Added a before/after example and the coverage table above to this README. See references/changelog.md for the full audit account.
  • 2.1.0 — Closed a coverage gap found during a direct comparison against the tool this skill was originally benchmarked against: added typography and formatting as voice-fingerprint markers (references/typographic-markers.md) and three clusters of structural patterns (borrowed authority, decorative structure, borrowed register) to references/plain-style-diagnostics.md. Also fixed a stale internal section cross-reference. See references/changelog.md for the specific patterns added and why each was placed where it was.
  • 2.0.0 — Rebuilt around independent research (stylometry, Orwell's plain-style diagnostics, formulaic-language psycholinguistics, forensic content-analysis criteria) rather than a comparative audit of an existing tool. See references/changelog.md for the full account of what changed and why.
  • 1.0.0 — Initial release, built after benchmarking against an existing AI-tell removal tool. Superseded by 2.0.0's independent research base.

License

MIT. See LICENSE.

References

  • Wikipedia: Signs of AI writing — primary source for the pattern taxonomy in references/plain-style-diagnostics.md's Clusters A through C and references/typographic-markers.md. See Coverage above for the section-by-section mapping.
  • WikiProject AI Cleanup — the Wikipedia project that maintains the guide above.

Credits

Early development benchmarked against blader/humanizer (MIT), an existing open-source AI-tell removal skill that itself cites the Wikipedia guide above as its own primary source. Bespoke's current structure is built from independent research (see references/changelog.md); this credit reflects where the project started, not its present design or its present sourcing.

About

Agent skill that helps you mold AI-generated writing into your own authentic voice, grounded in stylometry, plain-style principles, and forensic content analysis.

Topics

Resources

Stars

1 star

Watchers

0 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

Bespoke

A portable agent skill that builds writing from a specific person's real voice, grounded in four established, independent bodies of research rather than a fixed list of banned phrases:

  • Stylometry and authorship attribution for what an individual's actual linguistic fingerprint consists of (function words, sentence-length variance, recurring phrase patterns), the same class of evidence used in forensic authorship analysis since the statistical study of the disputed Federalist Papers.
  • Orwell's plain-style diagnostics, from "Politics and the English Language" (1946), for a principled account of why prefabricated phrasing reads as hollow, eight decades before anything resembling AI-generated text existed.
  • Formulaic-language psycholinguistics, for why the goal is swapping shared, generic phrasing for a writer's own recurring language, not eliminating pre-formed phrasing altogether.
  • Forensic content-analysis criteria (Criteria-Based Content Analysis and Reality Monitoring) for what distinguishes genuine, specific, lived detail from plausible-sounding invention.

It is plain Markdown with zero external dependencies: no API keys, no build step, nothing to install to use it. Full sourcing for all four is in references/.

Installation

Skills CLI

Install with the cross-agent skills CLI:

npx skills add blisse-code/bespoke --global

Update an existing install:

npx skills update bespoke --global

To install into every supported agent harness on your machine:

npx skills add blisse-code/bespoke --global --agent '*'

Omit --global for a project-local install that can be committed and shared with collaborators.

Claude Code plugin

/plugin marketplace add blisse-code/bespoke
/plugin install bespoke@bespoke

The skill is then invoked as /bespoke:bespoke.

Manual

Any agent harness can use the skill directly because the runtime artifact is SKILL.md. Copy it, and the references/ folder alongside it, into wherever your harness expects skill directories:

git clone https://github.com/blisse-code/bespoke.git /path/to/your/skills/bespoke

Or, if you already have this repo cloned:

mkdir -p /path/to/your/skills/bespoke
cp -r SKILL.md references /path/to/your/skills/bespoke/

Claude.ai

Upload SKILL.md and the references/ folder as a .skill file (zip the repo, excluding .git, .github, and .claude-plugin) through Settings → Capabilities → Skills.

Usage

Invoke however your harness exposes installed skills. Common forms:

/bespoke
Write in my voice: [paste a LinkedIn post topic]
Humanize this: [paste AI-sounding text]

The skill opens with a short intake if it doesn't already know your voice, platform, audience, and intention for the piece. Voice is an explicit choice, your own style or Bespoke's default, not a request for adjectives:

Voice: own style
[paste at least 100 words of your own past writing, an essay,
article, post, or email you actually wrote]
Task: LinkedIn post about a product launch delay
Audience: my team and a few clients who are already annoyed
Intention: own the delay without sounding defensive

From a real sample like that, Bespoke reads sentence-length pattern, function-word habits, and recurring phrases (Section 1) rather than working from a self-description. The profile that comes out of one might read, in Bespoke's own shorthand, as something like "direct, a little dry, no corporate hedging", but that's Bespoke's inference from your material, not something you type in yourself. Under 100 words, it'll ask for more before building anything from it. Say Voice: default instead to skip a personal fingerprint entirely and get Sections 2 through 4's plain-style discipline without one.

Before / after example 1: structural and typographic tells

(Illustration note: the "before" is a representative generic-AI-written passage, not a real product announcement. The "after" applies the voice profile from the intake example above, direct, a little dry, no corporate hedging, and adds a few concrete specifics, like "three teams asked" and "check Settings," that stand in for the kind of real detail a user would supply in an actual session. Bespoke doesn't invent those in practice; it asks for them or leaves the sentence plain. See Section 4's specificity test.)

Before (generic AI-written text):

🚀 Introducing Smart Scheduling: A Game-Changer for Your Workflow

We're thrilled to announce the launch of Smart Scheduling, a feature that stands as a testament to our commitment to innovation, efficiency, and user delight. This pivotal update marks a key turning point in our platform's evolving landscape.

Intelligent Automation: Intelligent automation ensures your calendar stays perfectly organized. Seamless Integration: Seamless integration means Smart Scheduling works effortlessly with the tools you already love. Real-Time Sync: Real-time sync keeps everyone — teammates, clients, and stakeholders — on the exact same page.

In order to fully leverage this robust new capability, users simply need to enable it in Settings. It could potentially possibly make a meaningful difference for teams juggling multiple calendars.

Additionally, Smart Scheduling isn't just a tool — it's a philosophy. It's not about saving time, it's about giving that time back to what truly matters. Whether you're a solo founder, a growing startup, or an established enterprise, Smart Scheduling has something for everyone.

We hope this helps streamline your day! Let us know if you have any questions — we'd love to hear from you. 🎉

Overall, we're incredibly excited about what this means for the future. The road ahead looks bright, and we can't wait to see what you build next.

After (Bespoke rewrite):

Smart Scheduling is live. Check Settings to turn it on.

It syncs your calendar with the tools you're already using, so teammates, clients, and anyone else on the invite are looking at the same times. No import step, no separate app to check.

We built it because three teams asked for the same thing in one month: stop making them reconcile two calendars by hand. If that's not your problem, you probably won't notice this update, and that's fine.

Turn it on and tell us what breaks.

Every pattern in the "before" maps to a specific rule this skill applies: the heading trades Title Case and an emoji for plain sentence case with no decoration; "stands as a testament to... innovation, efficiency, and user delight" (a dying metaphor stacked with rule-of-three padding) becomes nothing, because the fact that the feature exists doesn't need a legacy claim; the bolded inline-header list collapses into two plain sentences; "in order to fully leverage this robust... capability" (a filler phrase plus pretentious diction) becomes "so"; "could potentially possibly" (stacked hedging) becomes a specific, sourced reason instead of a hedge; the em dashes are gone; and the closing "Overall, we're incredibly excited..." (a generic positive conclusion) is replaced by an actual next step. See Coverage below for where each pattern lives in the skill.

Before / after example 2: voice and specificity, layered with a fixed personal-voice skill

The first example shows structural and typographic tells getting removed from a formatted document. This one shows the other half of the skill, Sections 1 and 4, working on a short, unformatted personal narrative, and demonstrates Section 8: layering Bespoke under a separate, fixed personal-voice skill rather than using Bespoke's generic defaults.

(Illustration note: this is a fictional narrative written to demonstrate the skill, not a real account, and doesn't depict any real, identifiable person. The "before" is a short, deliberately generic AI-written passage. For the "after," Bespoke's own intake (Section "The intake") was pre-filled per Section 8 by an existing fixed-voice skill, no em dashes, zero cap on unsupported facts, an "acid test" against real named entities, burstiness, grade 6-7 readability, restrained tone, no performed vulnerability, a quiet close over a dramatic one, rather than by a fresh sample. The specific narrative details below, the street name, the dialogue, the dead flash, are illustrative texture standing in for what a real user's own material would supply; see Section 4's specificity test for why a rewrite shouldn't invent this kind of detail about something that actually happened.)

Before (generic AI-written text, 199 characters):

Nestled in the vibrant heart of Kuala Lumpur, an unofficial date with a stunning model blossomed into an unforgettable, impromptu photoshoot, a testament to genuine chemistry and effortless artistry.

After (Bespoke rewrite, voice layered from a fixed personal-voice skill):

Met her at a rooftop bar off Jalan Alor on a Tuesday, the kind of humid Kuala Lumpur night that turns any jacket into a mistake by nine. She modeled part-time, she said, mostly for local streetwear brands. I brought a camera out of habit, not intent.

Two drinks in, she picked it up, turned it over, and said, "so are you going to use this or just carry it around."

We ended up on the street outside for maybe twenty minutes, I didn't check. Streetlights and a wet road did most of the work. My flash died halfway through. Neither of us minded.

What changed and why: "nestled in the vibrant heart of," "blossomed into," and "a testament to genuine chemistry and effortless artistry" (Fault 1's dying metaphors and promotional-language sub-family) are gone entirely rather than trimmed, because the plain fact underneath them, two people met, ended up taking pictures, doesn't need a frame telling the reader how to feel about it. In their place: a specific street and night (Section 4's contextual embedding), reproduced dialogue instead of summary ("she asked about the camera" would be the generic version), an unexpected complication a smooth invented account wouldn't think to include (the dead flash), and an admitted gap ("I didn't check") rather than false precision. Sentence length varies sharply, one long scene-setting sentence, then short and medium ones, per the layered skill's burstiness rule and Section 9's presence principle, rather than settling into the uniform mid-length rhythm generated text defaults to. Zero em dashes, per both the layered skill's hard rule and Section 1's typographic default. The close is a flat, quiet fact instead of a generic positive conclusion (Cluster D), which is the layered skill's own "solution is the hero, not the victim" instinct doing the same work Section 9 asks for from a different direction.

What it does

  • An explicit own-style-or-default choice, not a default assumption. Choosing your own style requires a real writing sample of at least 100 words, an essay, article, post, or email you actually wrote; under that, the skill says so and asks for more rather than guessing from a fragment. Adjectives alone ("direct, a little dry") don't satisfy either path. Choosing default skips the personal fingerprint and keeps every plain-style and typographic default in force.
  • A stylometric voice fingerprint, not a one-shot style match: function-word habits, sentence-length variance, opening patterns, and the writer's own recurring bigrams and trigrams, read from a real sample and kept for the rest of the conversation.
  • Orwell's plain-style check, applied as a live diagnostic: dying metaphors, verbal false limbs, pretentious diction, and meaningless words, the same four faults named in 1946, with current examples.
  • Five clusters of structural patterns beyond Orwell's essay: borrowed authority, decorative structure, borrowed register, hedging and throat-clearing, and mechanical uniformity, covering everything from significance inflation and promotional language to stacked hedging, throat-clearing openers, and uniform transition-word rotation across a whole document. See Coverage below for the full pattern list.
  • A hard zero-default on em and en dashes, not just "use sparingly": the finished draft is scanned for , , and their spaced/doubled-hyphen equivalents before delivery, unless a real voice sample shows the writer actually uses them, in which case the sample wins outright.
  • A formulaic-language swap, not a ban. Pre-formed phrasing is normal and necessary for fluent writing; the skill directs it toward the writer's own recurring phrases instead of shared clichés.
  • A specificity test drawn from forensic content analysis: contextual embedding, unexpected complications, reproduced (not summarized) conversation, and admitted gaps, the actual criteria used to distinguish genuine accounts from fabricated ones, repurposed as a construction checklist.
  • Presence, not just absence. Stripping every flagged pattern out and putting nothing back produces sterile prose, a different failure with the same symptom. Once a voice fingerprint exists, the skill writes toward it: uneven rhythm, real stance, unresolved mixed feelings, genuine self-correction, gated by content type and bounded by the no-fabrication rule throughout.
  • Platform-specific structure: Context-Core-Connect for LinkedIn and Substack, hook-plus-white-space for X and Threads, tight distillation for email and Slack.
  • Three invocation modes: pasted text (draft plus notes on what changed), file mode (rewrites a file in place, prose only), and embedded mode (bare final text for another agent or task using this skill as one step of a larger job).
  • An honest engagement gate. Rapport techniques that work by being honest are always available. Techniques that work by deceiving the reader are gated to disclosed, consensual contexts, not applied by default to published, audience-facing content. See references/engagement-ethics.md.
  • Verified detection science, not fabricated statistics.references/detection-science.md documents a citation-fabrication finding caught and excluded during research, and why current classifier-based detectors make surface-level evasion a weaker strategy than genuine specificity.

Coverage against Wikipedia's "Signs of AI writing" guide

The primary source for Bespoke's pattern taxonomy is Wikipedia's "Signs of AI writing" guide, maintained by WikiProject AI Cleanup from real examples observed across Wikipedia articles, drafts, and comments. See References below. That guide is broader than Bespoke's scope in one direction, it documents Wikipedia-specific markup and citation mechanics (broken wikitext, invalid DOIs, utm_source parameters, non-existent templates, skipped heading levels, and similar), none of which apply to general prose and none of which Bespoke checks. The table below covers the guide's Content, Language and Grammar, Style, and Communication sections, the parts that generalize to any writing, and where each lives in Bespoke.

The guide's general-prose patterns, and where they live in Bespoke

Wikipedia's patternWhere it lives in Bespoke
Undue emphasis on significance, legacy, and broader trendsplain-style-diagnostics.md, Fault 1, "Significance and legacy inflation"
Canned emphasis on notability, attribution, and media coverageplain-style-diagnostics.md, Cluster A, "Notability namedropping"
Superficial analysesplain-style-diagnostics.md, "Padding at the paragraph level"
Promotional and advertisement-like languageplain-style-diagnostics.md, Fault 1, "Promotional and brochure language"
Vague attributions and overgeneralization of opinionsplain-style-diagnostics.md, Cluster A, "Vague attribution"
Outline-like conclusions about challenges and future prospectsplain-style-diagnostics.md, "Padding at the paragraph level"
High density of "AI vocabulary" wordsplain-style-diagnostics.md, Fault 3, tied to SKILL.md Section 1's frequency framing
Avoidance of basic copulatives ("is"/"are")plain-style-diagnostics.md, Cluster B, "Copula avoidance"
Negative parallelisms (three subtypes)plain-style-diagnostics.md, Cluster B
Rule of threeplain-style-diagnostics.md, Cluster B
Lexical diversity / elegant variationplain-style-diagnostics.md, Cluster B, "Synonym cycling"
Title casetypographic-markers.md
Overuse of boldfacetypographic-markers.md
Inline-header vertical liststypographic-markers.md
Overuse of em dashestypographic-markers.md — hard zero-default, not "use sparingly"
Emoji as formattingtypographic-markers.md
Curly quotation markstypographic-markers.md
Collaborative communicationplain-style-diagnostics.md, Cluster C, "Chatbot artifacts"
Knowledge-cutoff disclaimersSKILL.md Section 4, folded into the specificity test rather than a word list
Phrasal templates and placeholder textSKILL.md Section 4, the specificity test's placeholder guidance

A few of the guide's Style-section items are Wikipedia-article conventions with no general-prose analog (title-heading formatting, skipped heading levels, level-1-heading overuse, thematic breaks between sections, unusual table use) and aren't in the table above for that reason, not because they're uncovered by oversight.

Patterns and features Bespoke has beyond the Wikipedia guide

  • Definitional throat-clearing openers ("X refers to..." used to warm up a paragraph before the real point) — plain-style-diagnostics.md, Cluster D.
  • Recap and meta-commentary closings ("In summary," "to conclude," restating what a piece already said) — Cluster D.
  • Uniform transition-word rotation (mechanically cycling However / Moreover / Furthermore / Additionally across paragraphs) — Cluster E.
  • Structural symmetry addiction (every section forced to the same paragraph count regardless of what the content needs) — Cluster E.
  • Frequency-based AI-vocabulary detection tied to stylometry. The wider AI-vocabulary list under Fault 3 is explicitly framed as an anomalous-rate signal connected to SKILL.md Section 1's function-word fingerprinting, not a flat banned-word list, so a single instance of a listed word isn't treated as a violation on its own.
  • Presence, not just absence (SKILL.md Section 9). Removing every flagged pattern and adding nothing back is a different failure with the same symptom as generated prose. Once a voice fingerprint exists, the skill actively writes toward it: uneven rhythm, real stance, unresolved mixed feelings, genuine self-correction, bounded by the no-fabrication rule throughout.
  • A stylometric voice fingerprint built from a real sample, kept and updated across a whole conversation rather than applied once per rewrite (SKILL.md Section 1), grounded in the same authorship-attribution research used in forensic linguistics.
  • A specificity test from forensic content-analysis criteria (CBCA, Reality Monitoring) for distinguishing genuine detail from plausible-sounding invention, not just an AI-tell scan (SKILL.md Section 4).
  • An honest-engagement gate on rapport techniques that work by deceiving the reader, restricted to disclosed, consensual contexts rather than applied by default (references/engagement-ethics.md).
  • Verified, sourced detection science, including a documented citation-fabrication finding caught and excluded during this project's own research (references/detection-science.md).

Repository structure

bespoke/
├── SKILL.md # the skill itself; source of truth
├── README.md # this file
├── AGENTS.md # guidance for agents/contributors editing this repo
├── LICENSE # MIT
├── .claude-plugin/
│ ├── plugin.json # Claude Code plugin manifest
│ └── marketplace.json # single-repo marketplace entry
├── .github/workflows/validate.yml # CI: runs the same checks below on every push
├── scripts/
│ └── validate_package.py # dependency-free sync checks (stdlib only)
└── references/
├── plain-style-diagnostics.md
├── typographic-markers.md
├── detection-science.md
├── engagement-ethics.md
└── changelog.md

Validating a local copy

python3 scripts/validate_package.py

Stdlib only, no pip install required. Checks that SKILL.md's name and version match .claude-plugin/plugin.json, that every file SKILL.md points to under references/ actually exists, and that the marketplace entry resolves.

Version history

  • 2.4.0 — Corrected the pattern taxonomy's primary-source attribution: references/plain-style-diagnostics.md's Clusters A through C now cite Wikipedia's "Signs of AI writing" guide directly, verified against the live page, rather than being attributed by way of blader/humanizer, which is itself downstream of that same guide. New README "References" section citing the Wikipedia guide and WikiProject AI Cleanup, its maintaining organization, without claiming any project affiliation beyond citation. The "Coverage" section is rebuilt against the guide's own Content, Language and Grammar, Style, and Communication sections (with its Wikipedia-specific markup and citation items explicitly noted as out of scope) rather than humanizer's numbered list. blader/humanizer now appears only in Credits, as the tool early development was benchmarked against. See references/changelog.md.
  • 2.3.0 — Made the Voice intake an explicit own-style-or-default choice rather than a default sample-or-adjectives request. Choosing own style now requires a real writing sample of at least 100 words, with an explicit ask for more if under that floor; adjectives alone no longer satisfy either path. Choosing default explicitly waives a personal fingerprint while keeping every plain-style and typographic default in force. New "The own-style-or-default gate" subsection in SKILL.md Section 1; intake item 1 and the Usage/"What it does" sections of this README updated to match. No change to any pattern in plain-style-diagnostics.md or typographic-markers.md. See references/changelog.md.
  • 2.2.1 — Added "Before / after example 2" to this README: a short, fictional, non-identifying personal narrative run through the installed skill with Voice pre-filled by a separate fixed personal-voice skill per Section 8, demonstrating Sections 1 and 4 (voice fingerprint, specificity test) on unformatted prose rather than the mostly structural/typographic first example. README-only; no change to SKILL.md or any pattern file. See references/changelog.md.
  • 2.2.0 — Full audit against blader/humanizer v2.9.1's complete 33-pattern taxonomy (see Coverage above). Closed every remaining gap: significance/legacy inflation and promotional/brochure language (Fault 1), the full high-frequency AI-vocabulary list tied to Section 1's stylometry framing (Fault 3), passive voice and subjectless fragments as a named pattern (Fault 2), filler phrases as an explicit stock list (Fault 2), and two new clusters, D (hedging, throat-clearing, and empty closes) and E (mechanical uniformity), the latter with no equivalent in humanizer's taxonomy. Hardened the em-dash default from "rare" to a zero-default with a pre-delivery scan, matching humanizer's hard-constraint treatment while keeping the sample-override principle. Added SKILL.md Section 9 ("Presence, not just absence") on actively writing toward the voice fingerprint rather than only scrubbing tells, Section 10 (invocation modes: pasted text, file, embedded), and an explicit two-question self-audit step in the Application workflow. Expanded plain-style-diagnostics.md's false-positive guidance from 4 items to 15. Added a before/after example and the coverage table above to this README. See references/changelog.md for the full audit account.
  • 2.1.0 — Closed a coverage gap found during a direct comparison against the tool this skill was originally benchmarked against: added typography and formatting as voice-fingerprint markers (references/typographic-markers.md) and three clusters of structural patterns (borrowed authority, decorative structure, borrowed register) to references/plain-style-diagnostics.md. Also fixed a stale internal section cross-reference. See references/changelog.md for the specific patterns added and why each was placed where it was.
  • 2.0.0 — Rebuilt around independent research (stylometry, Orwell's plain-style diagnostics, formulaic-language psycholinguistics, forensic content-analysis criteria) rather than a comparative audit of an existing tool. See references/changelog.md for the full account of what changed and why.
  • 1.0.0 — Initial release, built after benchmarking against an existing AI-tell removal tool. Superseded by 2.0.0's independent research base.

License

MIT. See LICENSE.

References

  • Wikipedia: Signs of AI writing — primary source for the pattern taxonomy in references/plain-style-diagnostics.md's Clusters A through C and references/typographic-markers.md. See Coverage above for the section-by-section mapping.
  • WikiProject AI Cleanup — the Wikipedia project that maintains the guide above.

Credits

Early development benchmarked against blader/humanizer (MIT), an existing open-source AI-tell removal skill that itself cites the Wikipedia guide above as its own primary source. Bespoke's current structure is built from independent research (see references/changelog.md); this credit reflects where the project started, not its present design or its present sourcing.

About

Agent skill that helps you mold AI-generated writing into your own authentic voice, grounded in stylometry, plain-style principles, and forensic content analysis.

Topics

Resources

Stars

1 star

Watchers

0 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

Bespoke

A portable agent skill that builds writing from a specific person's real voice, grounded in four established, independent bodies of research rather than a fixed list of banned phrases:

  • Stylometry and authorship attribution for what an individual's actual linguistic fingerprint consists of (function words, sentence-length variance, recurring phrase patterns), the same class of evidence used in forensic authorship analysis since the statistical study of the disputed Federalist Papers.
  • Orwell's plain-style diagnostics, from "Politics and the English Language" (1946), for a principled account of why prefabricated phrasing reads as hollow, eight decades before anything resembling AI-generated text existed.
  • Formulaic-language psycholinguistics, for why the goal is swapping shared, generic phrasing for a writer's own recurring language, not eliminating pre-formed phrasing altogether.
  • Forensic content-analysis criteria (Criteria-Based Content Analysis and Reality Monitoring) for what distinguishes genuine, specific, lived detail from plausible-sounding invention.

It is plain Markdown with zero external dependencies: no API keys, no build step, nothing to install to use it. Full sourcing for all four is in references/.

Installation

Skills CLI

Install with the cross-agent skills CLI:

npx skills add blisse-code/bespoke --global

Update an existing install:

npx skills update bespoke --global

To install into every supported agent harness on your machine:

npx skills add blisse-code/bespoke --global --agent '*'

Omit --global for a project-local install that can be committed and shared with collaborators.

Claude Code plugin

/plugin marketplace add blisse-code/bespoke
/plugin install bespoke@bespoke

The skill is then invoked as /bespoke:bespoke.

Manual

Any agent harness can use the skill directly because the runtime artifact is SKILL.md. Copy it, and the references/ folder alongside it, into wherever your harness expects skill directories:

git clone https://github.com/blisse-code/bespoke.git /path/to/your/skills/bespoke

Or, if you already have this repo cloned:

mkdir -p /path/to/your/skills/bespoke
cp -r SKILL.md references /path/to/your/skills/bespoke/

Claude.ai

Upload SKILL.md and the references/ folder as a .skill file (zip the repo, excluding .git, .github, and .claude-plugin) through Settings → Capabilities → Skills.

Usage

Invoke however your harness exposes installed skills. Common forms:

/bespoke
Write in my voice: [paste a LinkedIn post topic]
Humanize this: [paste AI-sounding text]

The skill opens with a short intake if it doesn't already know your voice, platform, audience, and intention for the piece. Voice is an explicit choice, your own style or Bespoke's default, not a request for adjectives:

Voice: own style
[paste at least 100 words of your own past writing, an essay,
article, post, or email you actually wrote]
Task: LinkedIn post about a product launch delay
Audience: my team and a few clients who are already annoyed
Intention: own the delay without sounding defensive

From a real sample like that, Bespoke reads sentence-length pattern, function-word habits, and recurring phrases (Section 1) rather than working from a self-description. The profile that comes out of one might read, in Bespoke's own shorthand, as something like "direct, a little dry, no corporate hedging", but that's Bespoke's inference from your material, not something you type in yourself. Under 100 words, it'll ask for more before building anything from it. Say Voice: default instead to skip a personal fingerprint entirely and get Sections 2 through 4's plain-style discipline without one.

Before / after example 1: structural and typographic tells

(Illustration note: the "before" is a representative generic-AI-written passage, not a real product announcement. The "after" applies the voice profile from the intake example above, direct, a little dry, no corporate hedging, and adds a few concrete specifics, like "three teams asked" and "check Settings," that stand in for the kind of real detail a user would supply in an actual session. Bespoke doesn't invent those in practice; it asks for them or leaves the sentence plain. See Section 4's specificity test.)

Before (generic AI-written text):

🚀 Introducing Smart Scheduling: A Game-Changer for Your Workflow

We're thrilled to announce the launch of Smart Scheduling, a feature that stands as a testament to our commitment to innovation, efficiency, and user delight. This pivotal update marks a key turning point in our platform's evolving landscape.

Intelligent Automation: Intelligent automation ensures your calendar stays perfectly organized. Seamless Integration: Seamless integration means Smart Scheduling works effortlessly with the tools you already love. Real-Time Sync: Real-time sync keeps everyone — teammates, clients, and stakeholders — on the exact same page.

In order to fully leverage this robust new capability, users simply need to enable it in Settings. It could potentially possibly make a meaningful difference for teams juggling multiple calendars.

Additionally, Smart Scheduling isn't just a tool — it's a philosophy. It's not about saving time, it's about giving that time back to what truly matters. Whether you're a solo founder, a growing startup, or an established enterprise, Smart Scheduling has something for everyone.

We hope this helps streamline your day! Let us know if you have any questions — we'd love to hear from you. 🎉

Overall, we're incredibly excited about what this means for the future. The road ahead looks bright, and we can't wait to see what you build next.

After (Bespoke rewrite):

Smart Scheduling is live. Check Settings to turn it on.

It syncs your calendar with the tools you're already using, so teammates, clients, and anyone else on the invite are looking at the same times. No import step, no separate app to check.

We built it because three teams asked for the same thing in one month: stop making them reconcile two calendars by hand. If that's not your problem, you probably won't notice this update, and that's fine.

Turn it on and tell us what breaks.

Every pattern in the "before" maps to a specific rule this skill applies: the heading trades Title Case and an emoji for plain sentence case with no decoration; "stands as a testament to... innovation, efficiency, and user delight" (a dying metaphor stacked with rule-of-three padding) becomes nothing, because the fact that the feature exists doesn't need a legacy claim; the bolded inline-header list collapses into two plain sentences; "in order to fully leverage this robust... capability" (a filler phrase plus pretentious diction) becomes "so"; "could potentially possibly" (stacked hedging) becomes a specific, sourced reason instead of a hedge; the em dashes are gone; and the closing "Overall, we're incredibly excited..." (a generic positive conclusion) is replaced by an actual next step. See Coverage below for where each pattern lives in the skill.

Before / after example 2: voice and specificity, layered with a fixed personal-voice skill

The first example shows structural and typographic tells getting removed from a formatted document. This one shows the other half of the skill, Sections 1 and 4, working on a short, unformatted personal narrative, and demonstrates Section 8: layering Bespoke under a separate, fixed personal-voice skill rather than using Bespoke's generic defaults.

(Illustration note: this is a fictional narrative written to demonstrate the skill, not a real account, and doesn't depict any real, identifiable person. The "before" is a short, deliberately generic AI-written passage. For the "after," Bespoke's own intake (Section "The intake") was pre-filled per Section 8 by an existing fixed-voice skill, no em dashes, zero cap on unsupported facts, an "acid test" against real named entities, burstiness, grade 6-7 readability, restrained tone, no performed vulnerability, a quiet close over a dramatic one, rather than by a fresh sample. The specific narrative details below, the street name, the dialogue, the dead flash, are illustrative texture standing in for what a real user's own material would supply; see Section 4's specificity test for why a rewrite shouldn't invent this kind of detail about something that actually happened.)

Before (generic AI-written text, 199 characters):

Nestled in the vibrant heart of Kuala Lumpur, an unofficial date with a stunning model blossomed into an unforgettable, impromptu photoshoot, a testament to genuine chemistry and effortless artistry.

After (Bespoke rewrite, voice layered from a fixed personal-voice skill):

Met her at a rooftop bar off Jalan Alor on a Tuesday, the kind of humid Kuala Lumpur night that turns any jacket into a mistake by nine. She modeled part-time, she said, mostly for local streetwear brands. I brought a camera out of habit, not intent.

Two drinks in, she picked it up, turned it over, and said, "so are you going to use this or just carry it around."

We ended up on the street outside for maybe twenty minutes, I didn't check. Streetlights and a wet road did most of the work. My flash died halfway through. Neither of us minded.

What changed and why: "nestled in the vibrant heart of," "blossomed into," and "a testament to genuine chemistry and effortless artistry" (Fault 1's dying metaphors and promotional-language sub-family) are gone entirely rather than trimmed, because the plain fact underneath them, two people met, ended up taking pictures, doesn't need a frame telling the reader how to feel about it. In their place: a specific street and night (Section 4's contextual embedding), reproduced dialogue instead of summary ("she asked about the camera" would be the generic version), an unexpected complication a smooth invented account wouldn't think to include (the dead flash), and an admitted gap ("I didn't check") rather than false precision. Sentence length varies sharply, one long scene-setting sentence, then short and medium ones, per the layered skill's burstiness rule and Section 9's presence principle, rather than settling into the uniform mid-length rhythm generated text defaults to. Zero em dashes, per both the layered skill's hard rule and Section 1's typographic default. The close is a flat, quiet fact instead of a generic positive conclusion (Cluster D), which is the layered skill's own "solution is the hero, not the victim" instinct doing the same work Section 9 asks for from a different direction.

What it does

  • An explicit own-style-or-default choice, not a default assumption. Choosing your own style requires a real writing sample of at least 100 words, an essay, article, post, or email you actually wrote; under that, the skill says so and asks for more rather than guessing from a fragment. Adjectives alone ("direct, a little dry") don't satisfy either path. Choosing default skips the personal fingerprint and keeps every plain-style and typographic default in force.
  • A stylometric voice fingerprint, not a one-shot style match: function-word habits, sentence-length variance, opening patterns, and the writer's own recurring bigrams and trigrams, read from a real sample and kept for the rest of the conversation.
  • Orwell's plain-style check, applied as a live diagnostic: dying metaphors, verbal false limbs, pretentious diction, and meaningless words, the same four faults named in 1946, with current examples.
  • Five clusters of structural patterns beyond Orwell's essay: borrowed authority, decorative structure, borrowed register, hedging and throat-clearing, and mechanical uniformity, covering everything from significance inflation and promotional language to stacked hedging, throat-clearing openers, and uniform transition-word rotation across a whole document. See Coverage below for the full pattern list.
  • A hard zero-default on em and en dashes, not just "use sparingly": the finished draft is scanned for , , and their spaced/doubled-hyphen equivalents before delivery, unless a real voice sample shows the writer actually uses them, in which case the sample wins outright.
  • A formulaic-language swap, not a ban. Pre-formed phrasing is normal and necessary for fluent writing; the skill directs it toward the writer's own recurring phrases instead of shared clichés.
  • A specificity test drawn from forensic content analysis: contextual embedding, unexpected complications, reproduced (not summarized) conversation, and admitted gaps, the actual criteria used to distinguish genuine accounts from fabricated ones, repurposed as a construction checklist.
  • Presence, not just absence. Stripping every flagged pattern out and putting nothing back produces sterile prose, a different failure with the same symptom. Once a voice fingerprint exists, the skill writes toward it: uneven rhythm, real stance, unresolved mixed feelings, genuine self-correction, gated by content type and bounded by the no-fabrication rule throughout.
  • Platform-specific structure: Context-Core-Connect for LinkedIn and Substack, hook-plus-white-space for X and Threads, tight distillation for email and Slack.
  • Three invocation modes: pasted text (draft plus notes on what changed), file mode (rewrites a file in place, prose only), and embedded mode (bare final text for another agent or task using this skill as one step of a larger job).
  • An honest engagement gate. Rapport techniques that work by being honest are always available. Techniques that work by deceiving the reader are gated to disclosed, consensual contexts, not applied by default to published, audience-facing content. See references/engagement-ethics.md.
  • Verified detection science, not fabricated statistics.references/detection-science.md documents a citation-fabrication finding caught and excluded during research, and why current classifier-based detectors make surface-level evasion a weaker strategy than genuine specificity.

Coverage against Wikipedia's "Signs of AI writing" guide

The primary source for Bespoke's pattern taxonomy is Wikipedia's "Signs of AI writing" guide, maintained by WikiProject AI Cleanup from real examples observed across Wikipedia articles, drafts, and comments. See References below. That guide is broader than Bespoke's scope in one direction, it documents Wikipedia-specific markup and citation mechanics (broken wikitext, invalid DOIs, utm_source parameters, non-existent templates, skipped heading levels, and similar), none of which apply to general prose and none of which Bespoke checks. The table below covers the guide's Content, Language and Grammar, Style, and Communication sections, the parts that generalize to any writing, and where each lives in Bespoke.

The guide's general-prose patterns, and where they live in Bespoke

Wikipedia's patternWhere it lives in Bespoke
Undue emphasis on significance, legacy, and broader trendsplain-style-diagnostics.md, Fault 1, "Significance and legacy inflation"
Canned emphasis on notability, attribution, and media coverageplain-style-diagnostics.md, Cluster A, "Notability namedropping"
Superficial analysesplain-style-diagnostics.md, "Padding at the paragraph level"
Promotional and advertisement-like languageplain-style-diagnostics.md, Fault 1, "Promotional and brochure language"
Vague attributions and overgeneralization of opinionsplain-style-diagnostics.md, Cluster A, "Vague attribution"
Outline-like conclusions about challenges and future prospectsplain-style-diagnostics.md, "Padding at the paragraph level"
High density of "AI vocabulary" wordsplain-style-diagnostics.md, Fault 3, tied to SKILL.md Section 1's frequency framing
Avoidance of basic copulatives ("is"/"are")plain-style-diagnostics.md, Cluster B, "Copula avoidance"
Negative parallelisms (three subtypes)plain-style-diagnostics.md, Cluster B
Rule of threeplain-style-diagnostics.md, Cluster B
Lexical diversity / elegant variationplain-style-diagnostics.md, Cluster B, "Synonym cycling"
Title casetypographic-markers.md
Overuse of boldfacetypographic-markers.md
Inline-header vertical liststypographic-markers.md
Overuse of em dashestypographic-markers.md — hard zero-default, not "use sparingly"
Emoji as formattingtypographic-markers.md
Curly quotation markstypographic-markers.md
Collaborative communicationplain-style-diagnostics.md, Cluster C, "Chatbot artifacts"
Knowledge-cutoff disclaimersSKILL.md Section 4, folded into the specificity test rather than a word list
Phrasal templates and placeholder textSKILL.md Section 4, the specificity test's placeholder guidance

A few of the guide's Style-section items are Wikipedia-article conventions with no general-prose analog (title-heading formatting, skipped heading levels, level-1-heading overuse, thematic breaks between sections, unusual table use) and aren't in the table above for that reason, not because they're uncovered by oversight.

Patterns and features Bespoke has beyond the Wikipedia guide

  • Definitional throat-clearing openers ("X refers to..." used to warm up a paragraph before the real point) — plain-style-diagnostics.md, Cluster D.
  • Recap and meta-commentary closings ("In summary," "to conclude," restating what a piece already said) — Cluster D.
  • Uniform transition-word rotation (mechanically cycling However / Moreover / Furthermore / Additionally across paragraphs) — Cluster E.
  • Structural symmetry addiction (every section forced to the same paragraph count regardless of what the content needs) — Cluster E.
  • Frequency-based AI-vocabulary detection tied to stylometry. The wider AI-vocabulary list under Fault 3 is explicitly framed as an anomalous-rate signal connected to SKILL.md Section 1's function-word fingerprinting, not a flat banned-word list, so a single instance of a listed word isn't treated as a violation on its own.
  • Presence, not just absence (SKILL.md Section 9). Removing every flagged pattern and adding nothing back is a different failure with the same symptom as generated prose. Once a voice fingerprint exists, the skill actively writes toward it: uneven rhythm, real stance, unresolved mixed feelings, genuine self-correction, bounded by the no-fabrication rule throughout.
  • A stylometric voice fingerprint built from a real sample, kept and updated across a whole conversation rather than applied once per rewrite (SKILL.md Section 1), grounded in the same authorship-attribution research used in forensic linguistics.
  • A specificity test from forensic content-analysis criteria (CBCA, Reality Monitoring) for distinguishing genuine detail from plausible-sounding invention, not just an AI-tell scan (SKILL.md Section 4).
  • An honest-engagement gate on rapport techniques that work by deceiving the reader, restricted to disclosed, consensual contexts rather than applied by default (references/engagement-ethics.md).
  • Verified, sourced detection science, including a documented citation-fabrication finding caught and excluded during this project's own research (references/detection-science.md).

Repository structure

bespoke/
├── SKILL.md # the skill itself; source of truth
├── README.md # this file
├── AGENTS.md # guidance for agents/contributors editing this repo
├── LICENSE # MIT
├── .claude-plugin/
│ ├── plugin.json # Claude Code plugin manifest
│ └── marketplace.json # single-repo marketplace entry
├── .github/workflows/validate.yml # CI: runs the same checks below on every push
├── scripts/
│ └── validate_package.py # dependency-free sync checks (stdlib only)
└── references/
├── plain-style-diagnostics.md
├── typographic-markers.md
├── detection-science.md
├── engagement-ethics.md
└── changelog.md

Validating a local copy

python3 scripts/validate_package.py

Stdlib only, no pip install required. Checks that SKILL.md's name and version match .claude-plugin/plugin.json, that every file SKILL.md points to under references/ actually exists, and that the marketplace entry resolves.

Version history

  • 2.4.0 — Corrected the pattern taxonomy's primary-source attribution: references/plain-style-diagnostics.md's Clusters A through C now cite Wikipedia's "Signs of AI writing" guide directly, verified against the live page, rather than being attributed by way of blader/humanizer, which is itself downstream of that same guide. New README "References" section citing the Wikipedia guide and WikiProject AI Cleanup, its maintaining organization, without claiming any project affiliation beyond citation. The "Coverage" section is rebuilt against the guide's own Content, Language and Grammar, Style, and Communication sections (with its Wikipedia-specific markup and citation items explicitly noted as out of scope) rather than humanizer's numbered list. blader/humanizer now appears only in Credits, as the tool early development was benchmarked against. See references/changelog.md.
  • 2.3.0 — Made the Voice intake an explicit own-style-or-default choice rather than a default sample-or-adjectives request. Choosing own style now requires a real writing sample of at least 100 words, with an explicit ask for more if under that floor; adjectives alone no longer satisfy either path. Choosing default explicitly waives a personal fingerprint while keeping every plain-style and typographic default in force. New "The own-style-or-default gate" subsection in SKILL.md Section 1; intake item 1 and the Usage/"What it does" sections of this README updated to match. No change to any pattern in plain-style-diagnostics.md or typographic-markers.md. See references/changelog.md.
  • 2.2.1 — Added "Before / after example 2" to this README: a short, fictional, non-identifying personal narrative run through the installed skill with Voice pre-filled by a separate fixed personal-voice skill per Section 8, demonstrating Sections 1 and 4 (voice fingerprint, specificity test) on unformatted prose rather than the mostly structural/typographic first example. README-only; no change to SKILL.md or any pattern file. See references/changelog.md.
  • 2.2.0 — Full audit against blader/humanizer v2.9.1's complete 33-pattern taxonomy (see Coverage above). Closed every remaining gap: significance/legacy inflation and promotional/brochure language (Fault 1), the full high-frequency AI-vocabulary list tied to Section 1's stylometry framing (Fault 3), passive voice and subjectless fragments as a named pattern (Fault 2), filler phrases as an explicit stock list (Fault 2), and two new clusters, D (hedging, throat-clearing, and empty closes) and E (mechanical uniformity), the latter with no equivalent in humanizer's taxonomy. Hardened the em-dash default from "rare" to a zero-default with a pre-delivery scan, matching humanizer's hard-constraint treatment while keeping the sample-override principle. Added SKILL.md Section 9 ("Presence, not just absence") on actively writing toward the voice fingerprint rather than only scrubbing tells, Section 10 (invocation modes: pasted text, file, embedded), and an explicit two-question self-audit step in the Application workflow. Expanded plain-style-diagnostics.md's false-positive guidance from 4 items to 15. Added a before/after example and the coverage table above to this README. See references/changelog.md for the full audit account.
  • 2.1.0 — Closed a coverage gap found during a direct comparison against the tool this skill was originally benchmarked against: added typography and formatting as voice-fingerprint markers (references/typographic-markers.md) and three clusters of structural patterns (borrowed authority, decorative structure, borrowed register) to references/plain-style-diagnostics.md. Also fixed a stale internal section cross-reference. See references/changelog.md for the specific patterns added and why each was placed where it was.
  • 2.0.0 — Rebuilt around independent research (stylometry, Orwell's plain-style diagnostics, formulaic-language psycholinguistics, forensic content-analysis criteria) rather than a comparative audit of an existing tool. See references/changelog.md for the full account of what changed and why.
  • 1.0.0 — Initial release, built after benchmarking against an existing AI-tell removal tool. Superseded by 2.0.0's independent research base.

License

MIT. See LICENSE.

References

  • Wikipedia: Signs of AI writing — primary source for the pattern taxonomy in references/plain-style-diagnostics.md's Clusters A through C and references/typographic-markers.md. See Coverage above for the section-by-section mapping.
  • WikiProject AI Cleanup — the Wikipedia project that maintains the guide above.

Credits

Early development benchmarked against blader/humanizer (MIT), an existing open-source AI-tell removal skill that itself cites the Wikipedia guide above as its own primary source. Bespoke's current structure is built from independent research (see references/changelog.md); this credit reflects where the project started, not its present design or its present sourcing.

About

Agent skill that helps you mold AI-generated writing into your own authentic voice, grounded in stylometry, plain-style principles, and forensic content analysis.

Topics

Resources

Stars

1 star

Watchers

0 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

Repository files navigation

Bespoke

A portable agent skill that builds writing from a specific person's real voice, grounded in four established, independent bodies of research rather than a fixed list of banned phrases:

  • Stylometry and authorship attribution for what an individual's actual linguistic fingerprint consists of (function words, sentence-length variance, recurring phrase patterns), the same class of evidence used in forensic authorship analysis since the statistical study of the disputed Federalist Papers.
  • Orwell's plain-style diagnostics, from "Politics and the English Language" (1946), for a principled account of why prefabricated phrasing reads as hollow, eight decades before anything resembling AI-generated text existed.
  • Formulaic-language psycholinguistics, for why the goal is swapping shared, generic phrasing for a writer's own recurring language, not eliminating pre-formed phrasing altogether.
  • Forensic content-analysis criteria (Criteria-Based Content Analysis and Reality Monitoring) for what distinguishes genuine, specific, lived detail from plausible-sounding invention.

It is plain Markdown with zero external dependencies: no API keys, no build step, nothing to install to use it. Full sourcing for all four is in references/.

Installation

Skills CLI

Install with the cross-agent skills CLI:

npx skills add blisse-code/bespoke --global

Update an existing install:

npx skills update bespoke --global

To install into every supported agent harness on your machine:

npx skills add blisse-code/bespoke --global --agent '*'

Omit --global for a project-local install that can be committed and shared with collaborators.

Claude Code plugin

/plugin marketplace add blisse-code/bespoke
/plugin install bespoke@bespoke

The skill is then invoked as /bespoke:bespoke.

Manual

Any agent harness can use the skill directly because the runtime artifact is SKILL.md. Copy it, and the references/ folder alongside it, into wherever your harness expects skill directories:

git clone https://github.com/blisse-code/bespoke.git /path/to/your/skills/bespoke

Or, if you already have this repo cloned:

mkdir -p /path/to/your/skills/bespoke
cp -r SKILL.md references /path/to/your/skills/bespoke/

Claude.ai

Upload SKILL.md and the references/ folder as a .skill file (zip the repo, excluding .git, .github, and .claude-plugin) through Settings → Capabilities → Skills.

Usage

Invoke however your harness exposes installed skills. Common forms:

/bespoke
Write in my voice: [paste a LinkedIn post topic]
Humanize this: [paste AI-sounding text]

The skill opens with a short intake if it doesn't already know your voice, platform, audience, and intention for the piece. Voice is an explicit choice, your own style or Bespoke's default, not a request for adjectives:

Voice: own style
[paste at least 100 words of your own past writing, an essay,
article, post, or email you actually wrote]
Task: LinkedIn post about a product launch delay
Audience: my team and a few clients who are already annoyed
Intention: own the delay without sounding defensive

From a real sample like that, Bespoke reads sentence-length pattern, function-word habits, and recurring phrases (Section 1) rather than working from a self-description. The profile that comes out of one might read, in Bespoke's own shorthand, as something like "direct, a little dry, no corporate hedging", but that's Bespoke's inference from your material, not something you type in yourself. Under 100 words, it'll ask for more before building anything from it. Say Voice: default instead to skip a personal fingerprint entirely and get Sections 2 through 4's plain-style discipline without one.

Before / after example 1: structural and typographic tells

(Illustration note: the "before" is a representative generic-AI-written passage, not a real product announcement. The "after" applies the voice profile from the intake example above, direct, a little dry, no corporate hedging, and adds a few concrete specifics, like "three teams asked" and "check Settings," that stand in for the kind of real detail a user would supply in an actual session. Bespoke doesn't invent those in practice; it asks for them or leaves the sentence plain. See Section 4's specificity test.)

Before (generic AI-written text):

🚀 Introducing Smart Scheduling: A Game-Changer for Your Workflow

We're thrilled to announce the launch of Smart Scheduling, a feature that stands as a testament to our commitment to innovation, efficiency, and user delight. This pivotal update marks a key turning point in our platform's evolving landscape.

Intelligent Automation: Intelligent automation ensures your calendar stays perfectly organized. Seamless Integration: Seamless integration means Smart Scheduling works effortlessly with the tools you already love. Real-Time Sync: Real-time sync keeps everyone — teammates, clients, and stakeholders — on the exact same page.

In order to fully leverage this robust new capability, users simply need to enable it in Settings. It could potentially possibly make a meaningful difference for teams juggling multiple calendars.

Additionally, Smart Scheduling isn't just a tool — it's a philosophy. It's not about saving time, it's about giving that time back to what truly matters. Whether you're a solo founder, a growing startup, or an established enterprise, Smart Scheduling has something for everyone.

We hope this helps streamline your day! Let us know if you have any questions — we'd love to hear from you. 🎉

Overall, we're incredibly excited about what this means for the future. The road ahead looks bright, and we can't wait to see what you build next.

After (Bespoke rewrite):

Smart Scheduling is live. Check Settings to turn it on.

It syncs your calendar with the tools you're already using, so teammates, clients, and anyone else on the invite are looking at the same times. No import step, no separate app to check.

We built it because three teams asked for the same thing in one month: stop making them reconcile two calendars by hand. If that's not your problem, you probably won't notice this update, and that's fine.

Turn it on and tell us what breaks.

Every pattern in the "before" maps to a specific rule this skill applies: the heading trades Title Case and an emoji for plain sentence case with no decoration; "stands as a testament to... innovation, efficiency, and user delight" (a dying metaphor stacked with rule-of-three padding) becomes nothing, because the fact that the feature exists doesn't need a legacy claim; the bolded inline-header list collapses into two plain sentences; "in order to fully leverage this robust... capability" (a filler phrase plus pretentious diction) becomes "so"; "could potentially possibly" (stacked hedging) becomes a specific, sourced reason instead of a hedge; the em dashes are gone; and the closing "Overall, we're incredibly excited..." (a generic positive conclusion) is replaced by an actual next step. See Coverage below for where each pattern lives in the skill.

Before / after example 2: voice and specificity, layered with a fixed personal-voice skill

The first example shows structural and typographic tells getting removed from a formatted document. This one shows the other half of the skill, Sections 1 and 4, working on a short, unformatted personal narrative, and demonstrates Section 8: layering Bespoke under a separate, fixed personal-voice skill rather than using Bespoke's generic defaults.

(Illustration note: this is a fictional narrative written to demonstrate the skill, not a real account, and doesn't depict any real, identifiable person. The "before" is a short, deliberately generic AI-written passage. For the "after," Bespoke's own intake (Section "The intake") was pre-filled per Section 8 by an existing fixed-voice skill, no em dashes, zero cap on unsupported facts, an "acid test" against real named entities, burstiness, grade 6-7 readability, restrained tone, no performed vulnerability, a quiet close over a dramatic one, rather than by a fresh sample. The specific narrative details below, the street name, the dialogue, the dead flash, are illustrative texture standing in for what a real user's own material would supply; see Section 4's specificity test for why a rewrite shouldn't invent this kind of detail about something that actually happened.)

Before (generic AI-written text, 199 characters):

Nestled in the vibrant heart of Kuala Lumpur, an unofficial date with a stunning model blossomed into an unforgettable, impromptu photoshoot, a testament to genuine chemistry and effortless artistry.

After (Bespoke rewrite, voice layered from a fixed personal-voice skill):

Met her at a rooftop bar off Jalan Alor on a Tuesday, the kind of humid Kuala Lumpur night that turns any jacket into a mistake by nine. She modeled part-time, she said, mostly for local streetwear brands. I brought a camera out of habit, not intent.

Two drinks in, she picked it up, turned it over, and said, "so are you going to use this or just carry it around."

We ended up on the street outside for maybe twenty minutes, I didn't check. Streetlights and a wet road did most of the work. My flash died halfway through. Neither of us minded.

What changed and why: "nestled in the vibrant heart of," "blossomed into," and "a testament to genuine chemistry and effortless artistry" (Fault 1's dying metaphors and promotional-language sub-family) are gone entirely rather than trimmed, because the plain fact underneath them, two people met, ended up taking pictures, doesn't need a frame telling the reader how to feel about it. In their place: a specific street and night (Section 4's contextual embedding), reproduced dialogue instead of summary ("she asked about the camera" would be the generic version), an unexpected complication a smooth invented account wouldn't think to include (the dead flash), and an admitted gap ("I didn't check") rather than false precision. Sentence length varies sharply, one long scene-setting sentence, then short and medium ones, per the layered skill's burstiness rule and Section 9's presence principle, rather than settling into the uniform mid-length rhythm generated text defaults to. Zero em dashes, per both the layered skill's hard rule and Section 1's typographic default. The close is a flat, quiet fact instead of a generic positive conclusion (Cluster D), which is the layered skill's own "solution is the hero, not the victim" instinct doing the same work Section 9 asks for from a different direction.

What it does

  • An explicit own-style-or-default choice, not a default assumption. Choosing your own style requires a real writing sample of at least 100 words, an essay, article, post, or email you actually wrote; under that, the skill says so and asks for more rather than guessing from a fragment. Adjectives alone ("direct, a little dry") don't satisfy either path. Choosing default skips the personal fingerprint and keeps every plain-style and typographic default in force.
  • A stylometric voice fingerprint, not a one-shot style match: function-word habits, sentence-length variance, opening patterns, and the writer's own recurring bigrams and trigrams, read from a real sample and kept for the rest of the conversation.
  • Orwell's plain-style check, applied as a live diagnostic: dying metaphors, verbal false limbs, pretentious diction, and meaningless words, the same four faults named in 1946, with current examples.
  • Five clusters of structural patterns beyond Orwell's essay: borrowed authority, decorative structure, borrowed register, hedging and throat-clearing, and mechanical uniformity, covering everything from significance inflation and promotional language to stacked hedging, throat-clearing openers, and uniform transition-word rotation across a whole document. See Coverage below for the full pattern list.
  • A hard zero-default on em and en dashes, not just "use sparingly": the finished draft is scanned for , , and their spaced/doubled-hyphen equivalents before delivery, unless a real voice sample shows the writer actually uses them, in which case the sample wins outright.
  • A formulaic-language swap, not a ban. Pre-formed phrasing is normal and necessary for fluent writing; the skill directs it toward the writer's own recurring phrases instead of shared clichés.
  • A specificity test drawn from forensic content analysis: contextual embedding, unexpected complications, reproduced (not summarized) conversation, and admitted gaps, the actual criteria used to distinguish genuine accounts from fabricated ones, repurposed as a construction checklist.
  • Presence, not just absence. Stripping every flagged pattern out and putting nothing back produces sterile prose, a different failure with the same symptom. Once a voice fingerprint exists, the skill writes toward it: uneven rhythm, real stance, unresolved mixed feelings, genuine self-correction, gated by content type and bounded by the no-fabrication rule throughout.
  • Platform-specific structure: Context-Core-Connect for LinkedIn and Substack, hook-plus-white-space for X and Threads, tight distillation for email and Slack.
  • Three invocation modes: pasted text (draft plus notes on what changed), file mode (rewrites a file in place, prose only), and embedded mode (bare final text for another agent or task using this skill as one step of a larger job).
  • An honest engagement gate. Rapport techniques that work by being honest are always available. Techniques that work by deceiving the reader are gated to disclosed, consensual contexts, not applied by default to published, audience-facing content. See references/engagement-ethics.md.
  • Verified detection science, not fabricated statistics.references/detection-science.md documents a citation-fabrication finding caught and excluded during research, and why current classifier-based detectors make surface-level evasion a weaker strategy than genuine specificity.

Coverage against Wikipedia's "Signs of AI writing" guide

The primary source for Bespoke's pattern taxonomy is Wikipedia's "Signs of AI writing" guide, maintained by WikiProject AI Cleanup from real examples observed across Wikipedia articles, drafts, and comments. See References below. That guide is broader than Bespoke's scope in one direction, it documents Wikipedia-specific markup and citation mechanics (broken wikitext, invalid DOIs, utm_source parameters, non-existent templates, skipped heading levels, and similar), none of which apply to general prose and none of which Bespoke checks. The table below covers the guide's Content, Language and Grammar, Style, and Communication sections, the parts that generalize to any writing, and where each lives in Bespoke.

The guide's general-prose patterns, and where they live in Bespoke

Wikipedia's patternWhere it lives in Bespoke
Undue emphasis on significance, legacy, and broader trendsplain-style-diagnostics.md, Fault 1, "Significance and legacy inflation"
Canned emphasis on notability, attribution, and media coverageplain-style-diagnostics.md, Cluster A, "Notability namedropping"
Superficial analysesplain-style-diagnostics.md, "Padding at the paragraph level"
Promotional and advertisement-like languageplain-style-diagnostics.md, Fault 1, "Promotional and brochure language"
Vague attributions and overgeneralization of opinionsplain-style-diagnostics.md, Cluster A, "Vague attribution"
Outline-like conclusions about challenges and future prospectsplain-style-diagnostics.md, "Padding at the paragraph level"
High density of "AI vocabulary" wordsplain-style-diagnostics.md, Fault 3, tied to SKILL.md Section 1's frequency framing
Avoidance of basic copulatives ("is"/"are")plain-style-diagnostics.md, Cluster B, "Copula avoidance"
Negative parallelisms (three subtypes)plain-style-diagnostics.md, Cluster B
Rule of threeplain-style-diagnostics.md, Cluster B
Lexical diversity / elegant variationplain-style-diagnostics.md, Cluster B, "Synonym cycling"
Title casetypographic-markers.md
Overuse of boldfacetypographic-markers.md
Inline-header vertical liststypographic-markers.md
Overuse of em dashestypographic-markers.md — hard zero-default, not "use sparingly"
Emoji as formattingtypographic-markers.md
Curly quotation markstypographic-markers.md
Collaborative communicationplain-style-diagnostics.md, Cluster C, "Chatbot artifacts"
Knowledge-cutoff disclaimersSKILL.md Section 4, folded into the specificity test rather than a word list
Phrasal templates and placeholder textSKILL.md Section 4, the specificity test's placeholder guidance

A few of the guide's Style-section items are Wikipedia-article conventions with no general-prose analog (title-heading formatting, skipped heading levels, level-1-heading overuse, thematic breaks between sections, unusual table use) and aren't in the table above for that reason, not because they're uncovered by oversight.

Patterns and features Bespoke has beyond the Wikipedia guide

  • Definitional throat-clearing openers ("X refers to..." used to warm up a paragraph before the real point) — plain-style-diagnostics.md, Cluster D.
  • Recap and meta-commentary closings ("In summary," "to conclude," restating what a piece already said) — Cluster D.
  • Uniform transition-word rotation (mechanically cycling However / Moreover / Furthermore / Additionally across paragraphs) — Cluster E.
  • Structural symmetry addiction (every section forced to the same paragraph count regardless of what the content needs) — Cluster E.
  • Frequency-based AI-vocabulary detection tied to stylometry. The wider AI-vocabulary list under Fault 3 is explicitly framed as an anomalous-rate signal connected to SKILL.md Section 1's function-word fingerprinting, not a flat banned-word list, so a single instance of a listed word isn't treated as a violation on its own.
  • Presence, not just absence (SKILL.md Section 9). Removing every flagged pattern and adding nothing back is a different failure with the same symptom as generated prose. Once a voice fingerprint exists, the skill actively writes toward it: uneven rhythm, real stance, unresolved mixed feelings, genuine self-correction, bounded by the no-fabrication rule throughout.
  • A stylometric voice fingerprint built from a real sample, kept and updated across a whole conversation rather than applied once per rewrite (SKILL.md Section 1), grounded in the same authorship-attribution research used in forensic linguistics.
  • A specificity test from forensic content-analysis criteria (CBCA, Reality Monitoring) for distinguishing genuine detail from plausible-sounding invention, not just an AI-tell scan (SKILL.md Section 4).
  • An honest-engagement gate on rapport techniques that work by deceiving the reader, restricted to disclosed, consensual contexts rather than applied by default (references/engagement-ethics.md).
  • Verified, sourced detection science, including a documented citation-fabrication finding caught and excluded during this project's own research (references/detection-science.md).

Repository structure

bespoke/
├── SKILL.md # the skill itself; source of truth
├── README.md # this file
├── AGENTS.md # guidance for agents/contributors editing this repo
├── LICENSE # MIT
├── .claude-plugin/
│ ├── plugin.json # Claude Code plugin manifest
│ └── marketplace.json # single-repo marketplace entry
├── .github/workflows/validate.yml # CI: runs the same checks below on every push
├── scripts/
│ └── validate_package.py # dependency-free sync checks (stdlib only)
└── references/
├── plain-style-diagnostics.md
├── typographic-markers.md
├── detection-science.md
├── engagement-ethics.md
└── changelog.md

Validating a local copy

python3 scripts/validate_package.py

Stdlib only, no pip install required. Checks that SKILL.md's name and version match .claude-plugin/plugin.json, that every file SKILL.md points to under references/ actually exists, and that the marketplace entry resolves.

Version history

  • 2.4.0 — Corrected the pattern taxonomy's primary-source attribution: references/plain-style-diagnostics.md's Clusters A through C now cite Wikipedia's "Signs of AI writing" guide directly, verified against the live page, rather than being attributed by way of blader/humanizer, which is itself downstream of that same guide. New README "References" section citing the Wikipedia guide and WikiProject AI Cleanup, its maintaining organization, without claiming any project affiliation beyond citation. The "Coverage" section is rebuilt against the guide's own Content, Language and Grammar, Style, and Communication sections (with its Wikipedia-specific markup and citation items explicitly noted as out of scope) rather than humanizer's numbered list. blader/humanizer now appears only in Credits, as the tool early development was benchmarked against. See references/changelog.md.
  • 2.3.0 — Made the Voice intake an explicit own-style-or-default choice rather than a default sample-or-adjectives request. Choosing own style now requires a real writing sample of at least 100 words, with an explicit ask for more if under that floor; adjectives alone no longer satisfy either path. Choosing default explicitly waives a personal fingerprint while keeping every plain-style and typographic default in force. New "The own-style-or-default gate" subsection in SKILL.md Section 1; intake item 1 and the Usage/"What it does" sections of this README updated to match. No change to any pattern in plain-style-diagnostics.md or typographic-markers.md. See references/changelog.md.
  • 2.2.1 — Added "Before / after example 2" to this README: a short, fictional, non-identifying personal narrative run through the installed skill with Voice pre-filled by a separate fixed personal-voice skill per Section 8, demonstrating Sections 1 and 4 (voice fingerprint, specificity test) on unformatted prose rather than the mostly structural/typographic first example. README-only; no change to SKILL.md or any pattern file. See references/changelog.md.
  • 2.2.0 — Full audit against blader/humanizer v2.9.1's complete 33-pattern taxonomy (see Coverage above). Closed every remaining gap: significance/legacy inflation and promotional/brochure language (Fault 1), the full high-frequency AI-vocabulary list tied to Section 1's stylometry framing (Fault 3), passive voice and subjectless fragments as a named pattern (Fault 2), filler phrases as an explicit stock list (Fault 2), and two new clusters, D (hedging, throat-clearing, and empty closes) and E (mechanical uniformity), the latter with no equivalent in humanizer's taxonomy. Hardened the em-dash default from "rare" to a zero-default with a pre-delivery scan, matching humanizer's hard-constraint treatment while keeping the sample-override principle. Added SKILL.md Section 9 ("Presence, not just absence") on actively writing toward the voice fingerprint rather than only scrubbing tells, Section 10 (invocation modes: pasted text, file, embedded), and an explicit two-question self-audit step in the Application workflow. Expanded plain-style-diagnostics.md's false-positive guidance from 4 items to 15. Added a before/after example and the coverage table above to this README. See references/changelog.md for the full audit account.
  • 2.1.0 — Closed a coverage gap found during a direct comparison against the tool this skill was originally benchmarked against: added typography and formatting as voice-fingerprint markers (references/typographic-markers.md) and three clusters of structural patterns (borrowed authority, decorative structure, borrowed register) to references/plain-style-diagnostics.md. Also fixed a stale internal section cross-reference. See references/changelog.md for the specific patterns added and why each was placed where it was.
  • 2.0.0 — Rebuilt around independent research (stylometry, Orwell's plain-style diagnostics, formulaic-language psycholinguistics, forensic content-analysis criteria) rather than a comparative audit of an existing tool. See references/changelog.md for the full account of what changed and why.
  • 1.0.0 — Initial release, built after benchmarking against an existing AI-tell removal tool. Superseded by 2.0.0's independent research base.

License

MIT. See LICENSE.

References

  • Wikipedia: Signs of AI writing — primary source for the pattern taxonomy in references/plain-style-diagnostics.md's Clusters A through C and references/typographic-markers.md. See Coverage above for the section-by-section mapping.
  • WikiProject AI Cleanup — the Wikipedia project that maintains the guide above.

Credits

Early development benchmarked against blader/humanizer (MIT), an existing open-source AI-tell removal skill that itself cites the Wikipedia guide above as its own primary source. Bespoke's current structure is built from independent research (see references/changelog.md); this credit reflects where the project started, not its present design or its present sourcing.

About

Agent skill that helps you mold AI-generated writing into your own authentic voice, grounded in stylometry, plain-style principles, and forensic content analysis.

Topics

Resources

Stars

1 star

Watchers

0 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

Bespoke

A portable agent skill that builds writing from a specific person's real voice, grounded in four established, independent bodies of research rather than a fixed list of banned phrases:

  • Stylometry and authorship attribution for what an individual's actual linguistic fingerprint consists of (function words, sentence-length variance, recurring phrase patterns), the same class of evidence used in forensic authorship analysis since the statistical study of the disputed Federalist Papers.
  • Orwell's plain-style diagnostics, from "Politics and the English Language" (1946), for a principled account of why prefabricated phrasing reads as hollow, eight decades before anything resembling AI-generated text existed.
  • Formulaic-language psycholinguistics, for why the goal is swapping shared, generic phrasing for a writer's own recurring language, not eliminating pre-formed phrasing altogether.
  • Forensic content-analysis criteria (Criteria-Based Content Analysis and Reality Monitoring) for what distinguishes genuine, specific, lived detail from plausible-sounding invention.

It is plain Markdown with zero external dependencies: no API keys, no build step, nothing to install to use it. Full sourcing for all four is in references/.

Installation

Skills CLI

Install with the cross-agent skills CLI:

npx skills add blisse-code/bespoke --global

Update an existing install:

npx skills update bespoke --global

To install into every supported agent harness on your machine:

npx skills add blisse-code/bespoke --global --agent '*'

Omit --global for a project-local install that can be committed and shared with collaborators.

Claude Code plugin

/plugin marketplace add blisse-code/bespoke
/plugin install bespoke@bespoke

The skill is then invoked as /bespoke:bespoke.

Manual

Any agent harness can use the skill directly because the runtime artifact is SKILL.md. Copy it, and the references/ folder alongside it, into wherever your harness expects skill directories:

git clone https://github.com/blisse-code/bespoke.git /path/to/your/skills/bespoke

Or, if you already have this repo cloned:

mkdir -p /path/to/your/skills/bespoke
cp -r SKILL.md references /path/to/your/skills/bespoke/

Claude.ai

Upload SKILL.md and the references/ folder as a .skill file (zip the repo, excluding .git, .github, and .claude-plugin) through Settings → Capabilities → Skills.

Usage

Invoke however your harness exposes installed skills. Common forms:

/bespoke
Write in my voice: [paste a LinkedIn post topic]
Humanize this: [paste AI-sounding text]

The skill opens with a short intake if it doesn't already know your voice, platform, audience, and intention for the piece. Voice is an explicit choice, your own style or Bespoke's default, not a request for adjectives:

Voice: own style
[paste at least 100 words of your own past writing, an essay,
article, post, or email you actually wrote]
Task: LinkedIn post about a product launch delay
Audience: my team and a few clients who are already annoyed
Intention: own the delay without sounding defensive

From a real sample like that, Bespoke reads sentence-length pattern, function-word habits, and recurring phrases (Section 1) rather than working from a self-description. The profile that comes out of one might read, in Bespoke's own shorthand, as something like "direct, a little dry, no corporate hedging", but that's Bespoke's inference from your material, not something you type in yourself. Under 100 words, it'll ask for more before building anything from it. Say Voice: default instead to skip a personal fingerprint entirely and get Sections 2 through 4's plain-style discipline without one.

Before / after example 1: structural and typographic tells

(Illustration note: the "before" is a representative generic-AI-written passage, not a real product announcement. The "after" applies the voice profile from the intake example above, direct, a little dry, no corporate hedging, and adds a few concrete specifics, like "three teams asked" and "check Settings," that stand in for the kind of real detail a user would supply in an actual session. Bespoke doesn't invent those in practice; it asks for them or leaves the sentence plain. See Section 4's specificity test.)

Before (generic AI-written text):

🚀 Introducing Smart Scheduling: A Game-Changer for Your Workflow

We're thrilled to announce the launch of Smart Scheduling, a feature that stands as a testament to our commitment to innovation, efficiency, and user delight. This pivotal update marks a key turning point in our platform's evolving landscape.

Intelligent Automation: Intelligent automation ensures your calendar stays perfectly organized. Seamless Integration: Seamless integration means Smart Scheduling works effortlessly with the tools you already love. Real-Time Sync: Real-time sync keeps everyone — teammates, clients, and stakeholders — on the exact same page.

In order to fully leverage this robust new capability, users simply need to enable it in Settings. It could potentially possibly make a meaningful difference for teams juggling multiple calendars.

Additionally, Smart Scheduling isn't just a tool — it's a philosophy. It's not about saving time, it's about giving that time back to what truly matters. Whether you're a solo founder, a growing startup, or an established enterprise, Smart Scheduling has something for everyone.

We hope this helps streamline your day! Let us know if you have any questions — we'd love to hear from you. 🎉

Overall, we're incredibly excited about what this means for the future. The road ahead looks bright, and we can't wait to see what you build next.

After (Bespoke rewrite):

Smart Scheduling is live. Check Settings to turn it on.

It syncs your calendar with the tools you're already using, so teammates, clients, and anyone else on the invite are looking at the same times. No import step, no separate app to check.

We built it because three teams asked for the same thing in one month: stop making them reconcile two calendars by hand. If that's not your problem, you probably won't notice this update, and that's fine.

Turn it on and tell us what breaks.

Every pattern in the "before" maps to a specific rule this skill applies: the heading trades Title Case and an emoji for plain sentence case with no decoration; "stands as a testament to... innovation, efficiency, and user delight" (a dying metaphor stacked with rule-of-three padding) becomes nothing, because the fact that the feature exists doesn't need a legacy claim; the bolded inline-header list collapses into two plain sentences; "in order to fully leverage this robust... capability" (a filler phrase plus pretentious diction) becomes "so"; "could potentially possibly" (stacked hedging) becomes a specific, sourced reason instead of a hedge; the em dashes are gone; and the closing "Overall, we're incredibly excited..." (a generic positive conclusion) is replaced by an actual next step. See Coverage below for where each pattern lives in the skill.

Before / after example 2: voice and specificity, layered with a fixed personal-voice skill

The first example shows structural and typographic tells getting removed from a formatted document. This one shows the other half of the skill, Sections 1 and 4, working on a short, unformatted personal narrative, and demonstrates Section 8: layering Bespoke under a separate, fixed personal-voice skill rather than using Bespoke's generic defaults.

(Illustration note: this is a fictional narrative written to demonstrate the skill, not a real account, and doesn't depict any real, identifiable person. The "before" is a short, deliberately generic AI-written passage. For the "after," Bespoke's own intake (Section "The intake") was pre-filled per Section 8 by an existing fixed-voice skill, no em dashes, zero cap on unsupported facts, an "acid test" against real named entities, burstiness, grade 6-7 readability, restrained tone, no performed vulnerability, a quiet close over a dramatic one, rather than by a fresh sample. The specific narrative details below, the street name, the dialogue, the dead flash, are illustrative texture standing in for what a real user's own material would supply; see Section 4's specificity test for why a rewrite shouldn't invent this kind of detail about something that actually happened.)

Before (generic AI-written text, 199 characters):

Nestled in the vibrant heart of Kuala Lumpur, an unofficial date with a stunning model blossomed into an unforgettable, impromptu photoshoot, a testament to genuine chemistry and effortless artistry.

After (Bespoke rewrite, voice layered from a fixed personal-voice skill):

Met her at a rooftop bar off Jalan Alor on a Tuesday, the kind of humid Kuala Lumpur night that turns any jacket into a mistake by nine. She modeled part-time, she said, mostly for local streetwear brands. I brought a camera out of habit, not intent.

Two drinks in, she picked it up, turned it over, and said, "so are you going to use this or just carry it around."

We ended up on the street outside for maybe twenty minutes, I didn't check. Streetlights and a wet road did most of the work. My flash died halfway through. Neither of us minded.

What changed and why: "nestled in the vibrant heart of," "blossomed into," and "a testament to genuine chemistry and effortless artistry" (Fault 1's dying metaphors and promotional-language sub-family) are gone entirely rather than trimmed, because the plain fact underneath them, two people met, ended up taking pictures, doesn't need a frame telling the reader how to feel about it. In their place: a specific street and night (Section 4's contextual embedding), reproduced dialogue instead of summary ("she asked about the camera" would be the generic version), an unexpected complication a smooth invented account wouldn't think to include (the dead flash), and an admitted gap ("I didn't check") rather than false precision. Sentence length varies sharply, one long scene-setting sentence, then short and medium ones, per the layered skill's burstiness rule and Section 9's presence principle, rather than settling into the uniform mid-length rhythm generated text defaults to. Zero em dashes, per both the layered skill's hard rule and Section 1's typographic default. The close is a flat, quiet fact instead of a generic positive conclusion (Cluster D), which is the layered skill's own "solution is the hero, not the victim" instinct doing the same work Section 9 asks for from a different direction.

What it does

  • An explicit own-style-or-default choice, not a default assumption. Choosing your own style requires a real writing sample of at least 100 words, an essay, article, post, or email you actually wrote; under that, the skill says so and asks for more rather than guessing from a fragment. Adjectives alone ("direct, a little dry") don't satisfy either path. Choosing default skips the personal fingerprint and keeps every plain-style and typographic default in force.
  • A stylometric voice fingerprint, not a one-shot style match: function-word habits, sentence-length variance, opening patterns, and the writer's own recurring bigrams and trigrams, read from a real sample and kept for the rest of the conversation.
  • Orwell's plain-style check, applied as a live diagnostic: dying metaphors, verbal false limbs, pretentious diction, and meaningless words, the same four faults named in 1946, with current examples.
  • Five clusters of structural patterns beyond Orwell's essay: borrowed authority, decorative structure, borrowed register, hedging and throat-clearing, and mechanical uniformity, covering everything from significance inflation and promotional language to stacked hedging, throat-clearing openers, and uniform transition-word rotation across a whole document. See Coverage below for the full pattern list.
  • A hard zero-default on em and en dashes, not just "use sparingly": the finished draft is scanned for , , and their spaced/doubled-hyphen equivalents before delivery, unless a real voice sample shows the writer actually uses them, in which case the sample wins outright.
  • A formulaic-language swap, not a ban. Pre-formed phrasing is normal and necessary for fluent writing; the skill directs it toward the writer's own recurring phrases instead of shared clichés.
  • A specificity test drawn from forensic content analysis: contextual embedding, unexpected complications, reproduced (not summarized) conversation, and admitted gaps, the actual criteria used to distinguish genuine accounts from fabricated ones, repurposed as a construction checklist.
  • Presence, not just absence. Stripping every flagged pattern out and putting nothing back produces sterile prose, a different failure with the same symptom. Once a voice fingerprint exists, the skill writes toward it: uneven rhythm, real stance, unresolved mixed feelings, genuine self-correction, gated by content type and bounded by the no-fabrication rule throughout.
  • Platform-specific structure: Context-Core-Connect for LinkedIn and Substack, hook-plus-white-space for X and Threads, tight distillation for email and Slack.
  • Three invocation modes: pasted text (draft plus notes on what changed), file mode (rewrites a file in place, prose only), and embedded mode (bare final text for another agent or task using this skill as one step of a larger job).
  • An honest engagement gate. Rapport techniques that work by being honest are always available. Techniques that work by deceiving the reader are gated to disclosed, consensual contexts, not applied by default to published, audience-facing content. See references/engagement-ethics.md.
  • Verified detection science, not fabricated statistics.references/detection-science.md documents a citation-fabrication finding caught and excluded during research, and why current classifier-based detectors make surface-level evasion a weaker strategy than genuine specificity.

Coverage against Wikipedia's "Signs of AI writing" guide

The primary source for Bespoke's pattern taxonomy is Wikipedia's "Signs of AI writing" guide, maintained by WikiProject AI Cleanup from real examples observed across Wikipedia articles, drafts, and comments. See References below. That guide is broader than Bespoke's scope in one direction, it documents Wikipedia-specific markup and citation mechanics (broken wikitext, invalid DOIs, utm_source parameters, non-existent templates, skipped heading levels, and similar), none of which apply to general prose and none of which Bespoke checks. The table below covers the guide's Content, Language and Grammar, Style, and Communication sections, the parts that generalize to any writing, and where each lives in Bespoke.

The guide's general-prose patterns, and where they live in Bespoke

Wikipedia's patternWhere it lives in Bespoke
Undue emphasis on significance, legacy, and broader trendsplain-style-diagnostics.md, Fault 1, "Significance and legacy inflation"
Canned emphasis on notability, attribution, and media coverageplain-style-diagnostics.md, Cluster A, "Notability namedropping"
Superficial analysesplain-style-diagnostics.md, "Padding at the paragraph level"
Promotional and advertisement-like languageplain-style-diagnostics.md, Fault 1, "Promotional and brochure language"
Vague attributions and overgeneralization of opinionsplain-style-diagnostics.md, Cluster A, "Vague attribution"
Outline-like conclusions about challenges and future prospectsplain-style-diagnostics.md, "Padding at the paragraph level"
High density of "AI vocabulary" wordsplain-style-diagnostics.md, Fault 3, tied to SKILL.md Section 1's frequency framing
Avoidance of basic copulatives ("is"/"are")plain-style-diagnostics.md, Cluster B, "Copula avoidance"
Negative parallelisms (three subtypes)plain-style-diagnostics.md, Cluster B
Rule of threeplain-style-diagnostics.md, Cluster B
Lexical diversity / elegant variationplain-style-diagnostics.md, Cluster B, "Synonym cycling"
Title casetypographic-markers.md
Overuse of boldfacetypographic-markers.md
Inline-header vertical liststypographic-markers.md
Overuse of em dashestypographic-markers.md — hard zero-default, not "use sparingly"
Emoji as formattingtypographic-markers.md
Curly quotation markstypographic-markers.md
Collaborative communicationplain-style-diagnostics.md, Cluster C, "Chatbot artifacts"
Knowledge-cutoff disclaimersSKILL.md Section 4, folded into the specificity test rather than a word list
Phrasal templates and placeholder textSKILL.md Section 4, the specificity test's placeholder guidance

A few of the guide's Style-section items are Wikipedia-article conventions with no general-prose analog (title-heading formatting, skipped heading levels, level-1-heading overuse, thematic breaks between sections, unusual table use) and aren't in the table above for that reason, not because they're uncovered by oversight.

Patterns and features Bespoke has beyond the Wikipedia guide

  • Definitional throat-clearing openers ("X refers to..." used to warm up a paragraph before the real point) — plain-style-diagnostics.md, Cluster D.
  • Recap and meta-commentary closings ("In summary," "to conclude," restating what a piece already said) — Cluster D.
  • Uniform transition-word rotation (mechanically cycling However / Moreover / Furthermore / Additionally across paragraphs) — Cluster E.
  • Structural symmetry addiction (every section forced to the same paragraph count regardless of what the content needs) — Cluster E.
  • Frequency-based AI-vocabulary detection tied to stylometry. The wider AI-vocabulary list under Fault 3 is explicitly framed as an anomalous-rate signal connected to SKILL.md Section 1's function-word fingerprinting, not a flat banned-word list, so a single instance of a listed word isn't treated as a violation on its own.
  • Presence, not just absence (SKILL.md Section 9). Removing every flagged pattern and adding nothing back is a different failure with the same symptom as generated prose. Once a voice fingerprint exists, the skill actively writes toward it: uneven rhythm, real stance, unresolved mixed feelings, genuine self-correction, bounded by the no-fabrication rule throughout.
  • A stylometric voice fingerprint built from a real sample, kept and updated across a whole conversation rather than applied once per rewrite (SKILL.md Section 1), grounded in the same authorship-attribution research used in forensic linguistics.
  • A specificity test from forensic content-analysis criteria (CBCA, Reality Monitoring) for distinguishing genuine detail from plausible-sounding invention, not just an AI-tell scan (SKILL.md Section 4).
  • An honest-engagement gate on rapport techniques that work by deceiving the reader, restricted to disclosed, consensual contexts rather than applied by default (references/engagement-ethics.md).
  • Verified, sourced detection science, including a documented citation-fabrication finding caught and excluded during this project's own research (references/detection-science.md).

Repository structure

bespoke/
├── SKILL.md # the skill itself; source of truth
├── README.md # this file
├── AGENTS.md # guidance for agents/contributors editing this repo
├── LICENSE # MIT
├── .claude-plugin/
│ ├── plugin.json # Claude Code plugin manifest
│ └── marketplace.json # single-repo marketplace entry
├── .github/workflows/validate.yml # CI: runs the same checks below on every push
├── scripts/
│ └── validate_package.py # dependency-free sync checks (stdlib only)
└── references/
├── plain-style-diagnostics.md
├── typographic-markers.md
├── detection-science.md
├── engagement-ethics.md
└── changelog.md

Validating a local copy

python3 scripts/validate_package.py

Stdlib only, no pip install required. Checks that SKILL.md's name and version match .claude-plugin/plugin.json, that every file SKILL.md points to under references/ actually exists, and that the marketplace entry resolves.

Version history

  • 2.4.0 — Corrected the pattern taxonomy's primary-source attribution: references/plain-style-diagnostics.md's Clusters A through C now cite Wikipedia's "Signs of AI writing" guide directly, verified against the live page, rather than being attributed by way of blader/humanizer, which is itself downstream of that same guide. New README "References" section citing the Wikipedia guide and WikiProject AI Cleanup, its maintaining organization, without claiming any project affiliation beyond citation. The "Coverage" section is rebuilt against the guide's own Content, Language and Grammar, Style, and Communication sections (with its Wikipedia-specific markup and citation items explicitly noted as out of scope) rather than humanizer's numbered list. blader/humanizer now appears only in Credits, as the tool early development was benchmarked against. See references/changelog.md.
  • 2.3.0 — Made the Voice intake an explicit own-style-or-default choice rather than a default sample-or-adjectives request. Choosing own style now requires a real writing sample of at least 100 words, with an explicit ask for more if under that floor; adjectives alone no longer satisfy either path. Choosing default explicitly waives a personal fingerprint while keeping every plain-style and typographic default in force. New "The own-style-or-default gate" subsection in SKILL.md Section 1; intake item 1 and the Usage/"What it does" sections of this README updated to match. No change to any pattern in plain-style-diagnostics.md or typographic-markers.md. See references/changelog.md.
  • 2.2.1 — Added "Before / after example 2" to this README: a short, fictional, non-identifying personal narrative run through the installed skill with Voice pre-filled by a separate fixed personal-voice skill per Section 8, demonstrating Sections 1 and 4 (voice fingerprint, specificity test) on unformatted prose rather than the mostly structural/typographic first example. README-only; no change to SKILL.md or any pattern file. See references/changelog.md.
  • 2.2.0 — Full audit against blader/humanizer v2.9.1's complete 33-pattern taxonomy (see Coverage above). Closed every remaining gap: significance/legacy inflation and promotional/brochure language (Fault 1), the full high-frequency AI-vocabulary list tied to Section 1's stylometry framing (Fault 3), passive voice and subjectless fragments as a named pattern (Fault 2), filler phrases as an explicit stock list (Fault 2), and two new clusters, D (hedging, throat-clearing, and empty closes) and E (mechanical uniformity), the latter with no equivalent in humanizer's taxonomy. Hardened the em-dash default from "rare" to a zero-default with a pre-delivery scan, matching humanizer's hard-constraint treatment while keeping the sample-override principle. Added SKILL.md Section 9 ("Presence, not just absence") on actively writing toward the voice fingerprint rather than only scrubbing tells, Section 10 (invocation modes: pasted text, file, embedded), and an explicit two-question self-audit step in the Application workflow. Expanded plain-style-diagnostics.md's false-positive guidance from 4 items to 15. Added a before/after example and the coverage table above to this README. See references/changelog.md for the full audit account.
  • 2.1.0 — Closed a coverage gap found during a direct comparison against the tool this skill was originally benchmarked against: added typography and formatting as voice-fingerprint markers (references/typographic-markers.md) and three clusters of structural patterns (borrowed authority, decorative structure, borrowed register) to references/plain-style-diagnostics.md. Also fixed a stale internal section cross-reference. See references/changelog.md for the specific patterns added and why each was placed where it was.
  • 2.0.0 — Rebuilt around independent research (stylometry, Orwell's plain-style diagnostics, formulaic-language psycholinguistics, forensic content-analysis criteria) rather than a comparative audit of an existing tool. See references/changelog.md for the full account of what changed and why.
  • 1.0.0 — Initial release, built after benchmarking against an existing AI-tell removal tool. Superseded by 2.0.0's independent research base.

License

MIT. See LICENSE.

References

  • Wikipedia: Signs of AI writing — primary source for the pattern taxonomy in references/plain-style-diagnostics.md's Clusters A through C and references/typographic-markers.md. See Coverage above for the section-by-section mapping.
  • WikiProject AI Cleanup — the Wikipedia project that maintains the guide above.

Credits

Early development benchmarked against blader/humanizer (MIT), an existing open-source AI-tell removal skill that itself cites the Wikipedia guide above as its own primary source. Bespoke's current structure is built from independent research (see references/changelog.md); this credit reflects where the project started, not its present design or its present sourcing.

About

Agent skill that helps you mold AI-generated writing into your own authentic voice, grounded in stylometry, plain-style principles, and forensic content analysis.

Topics

Resources

Stars

1 star

Watchers

0 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

Bespoke

A portable agent skill that builds writing from a specific person's real voice, grounded in four established, independent bodies of research rather than a fixed list of banned phrases:

  • Stylometry and authorship attribution for what an individual's actual linguistic fingerprint consists of (function words, sentence-length variance, recurring phrase patterns), the same class of evidence used in forensic authorship analysis since the statistical study of the disputed Federalist Papers.
  • Orwell's plain-style diagnostics, from "Politics and the English Language" (1946), for a principled account of why prefabricated phrasing reads as hollow, eight decades before anything resembling AI-generated text existed.
  • Formulaic-language psycholinguistics, for why the goal is swapping shared, generic phrasing for a writer's own recurring language, not eliminating pre-formed phrasing altogether.
  • Forensic content-analysis criteria (Criteria-Based Content Analysis and Reality Monitoring) for what distinguishes genuine, specific, lived detail from plausible-sounding invention.

It is plain Markdown with zero external dependencies: no API keys, no build step, nothing to install to use it. Full sourcing for all four is in references/.

Installation

Skills CLI

Install with the cross-agent skills CLI:

npx skills add blisse-code/bespoke --global

Update an existing install:

npx skills update bespoke --global

To install into every supported agent harness on your machine:

npx skills add blisse-code/bespoke --global --agent '*'

Omit --global for a project-local install that can be committed and shared with collaborators.

Claude Code plugin

/plugin marketplace add blisse-code/bespoke
/plugin install bespoke@bespoke

The skill is then invoked as /bespoke:bespoke.

Manual

Any agent harness can use the skill directly because the runtime artifact is SKILL.md. Copy it, and the references/ folder alongside it, into wherever your harness expects skill directories:

git clone https://github.com/blisse-code/bespoke.git /path/to/your/skills/bespoke

Or, if you already have this repo cloned:

mkdir -p /path/to/your/skills/bespoke
cp -r SKILL.md references /path/to/your/skills/bespoke/

Claude.ai

Upload SKILL.md and the references/ folder as a .skill file (zip the repo, excluding .git, .github, and .claude-plugin) through Settings → Capabilities → Skills.

Usage

Invoke however your harness exposes installed skills. Common forms:

/bespoke
Write in my voice: [paste a LinkedIn post topic]
Humanize this: [paste AI-sounding text]

The skill opens with a short intake if it doesn't already know your voice, platform, audience, and intention for the piece. Voice is an explicit choice, your own style or Bespoke's default, not a request for adjectives:

Voice: own style
[paste at least 100 words of your own past writing, an essay,
article, post, or email you actually wrote]
Task: LinkedIn post about a product launch delay
Audience: my team and a few clients who are already annoyed
Intention: own the delay without sounding defensive

From a real sample like that, Bespoke reads sentence-length pattern, function-word habits, and recurring phrases (Section 1) rather than working from a self-description. The profile that comes out of one might read, in Bespoke's own shorthand, as something like "direct, a little dry, no corporate hedging", but that's Bespoke's inference from your material, not something you type in yourself. Under 100 words, it'll ask for more before building anything from it. Say Voice: default instead to skip a personal fingerprint entirely and get Sections 2 through 4's plain-style discipline without one.

Before / after example 1: structural and typographic tells

(Illustration note: the "before" is a representative generic-AI-written passage, not a real product announcement. The "after" applies the voice profile from the intake example above, direct, a little dry, no corporate hedging, and adds a few concrete specifics, like "three teams asked" and "check Settings," that stand in for the kind of real detail a user would supply in an actual session. Bespoke doesn't invent those in practice; it asks for them or leaves the sentence plain. See Section 4's specificity test.)

Before (generic AI-written text):

🚀 Introducing Smart Scheduling: A Game-Changer for Your Workflow

We're thrilled to announce the launch of Smart Scheduling, a feature that stands as a testament to our commitment to innovation, efficiency, and user delight. This pivotal update marks a key turning point in our platform's evolving landscape.

Intelligent Automation: Intelligent automation ensures your calendar stays perfectly organized. Seamless Integration: Seamless integration means Smart Scheduling works effortlessly with the tools you already love. Real-Time Sync: Real-time sync keeps everyone — teammates, clients, and stakeholders — on the exact same page.

In order to fully leverage this robust new capability, users simply need to enable it in Settings. It could potentially possibly make a meaningful difference for teams juggling multiple calendars.

Additionally, Smart Scheduling isn't just a tool — it's a philosophy. It's not about saving time, it's about giving that time back to what truly matters. Whether you're a solo founder, a growing startup, or an established enterprise, Smart Scheduling has something for everyone.

We hope this helps streamline your day! Let us know if you have any questions — we'd love to hear from you. 🎉

Overall, we're incredibly excited about what this means for the future. The road ahead looks bright, and we can't wait to see what you build next.

After (Bespoke rewrite):

Smart Scheduling is live. Check Settings to turn it on.

It syncs your calendar with the tools you're already using, so teammates, clients, and anyone else on the invite are looking at the same times. No import step, no separate app to check.

We built it because three teams asked for the same thing in one month: stop making them reconcile two calendars by hand. If that's not your problem, you probably won't notice this update, and that's fine.

Turn it on and tell us what breaks.

Every pattern in the "before" maps to a specific rule this skill applies: the heading trades Title Case and an emoji for plain sentence case with no decoration; "stands as a testament to... innovation, efficiency, and user delight" (a dying metaphor stacked with rule-of-three padding) becomes nothing, because the fact that the feature exists doesn't need a legacy claim; the bolded inline-header list collapses into two plain sentences; "in order to fully leverage this robust... capability" (a filler phrase plus pretentious diction) becomes "so"; "could potentially possibly" (stacked hedging) becomes a specific, sourced reason instead of a hedge; the em dashes are gone; and the closing "Overall, we're incredibly excited..." (a generic positive conclusion) is replaced by an actual next step. See Coverage below for where each pattern lives in the skill.

Before / after example 2: voice and specificity, layered with a fixed personal-voice skill

The first example shows structural and typographic tells getting removed from a formatted document. This one shows the other half of the skill, Sections 1 and 4, working on a short, unformatted personal narrative, and demonstrates Section 8: layering Bespoke under a separate, fixed personal-voice skill rather than using Bespoke's generic defaults.

(Illustration note: this is a fictional narrative written to demonstrate the skill, not a real account, and doesn't depict any real, identifiable person. The "before" is a short, deliberately generic AI-written passage. For the "after," Bespoke's own intake (Section "The intake") was pre-filled per Section 8 by an existing fixed-voice skill, no em dashes, zero cap on unsupported facts, an "acid test" against real named entities, burstiness, grade 6-7 readability, restrained tone, no performed vulnerability, a quiet close over a dramatic one, rather than by a fresh sample. The specific narrative details below, the street name, the dialogue, the dead flash, are illustrative texture standing in for what a real user's own material would supply; see Section 4's specificity test for why a rewrite shouldn't invent this kind of detail about something that actually happened.)

Before (generic AI-written text, 199 characters):

Nestled in the vibrant heart of Kuala Lumpur, an unofficial date with a stunning model blossomed into an unforgettable, impromptu photoshoot, a testament to genuine chemistry and effortless artistry.

After (Bespoke rewrite, voice layered from a fixed personal-voice skill):

Met her at a rooftop bar off Jalan Alor on a Tuesday, the kind of humid Kuala Lumpur night that turns any jacket into a mistake by nine. She modeled part-time, she said, mostly for local streetwear brands. I brought a camera out of habit, not intent.

Two drinks in, she picked it up, turned it over, and said, "so are you going to use this or just carry it around."

We ended up on the street outside for maybe twenty minutes, I didn't check. Streetlights and a wet road did most of the work. My flash died halfway through. Neither of us minded.

What changed and why: "nestled in the vibrant heart of," "blossomed into," and "a testament to genuine chemistry and effortless artistry" (Fault 1's dying metaphors and promotional-language sub-family) are gone entirely rather than trimmed, because the plain fact underneath them, two people met, ended up taking pictures, doesn't need a frame telling the reader how to feel about it. In their place: a specific street and night (Section 4's contextual embedding), reproduced dialogue instead of summary ("she asked about the camera" would be the generic version), an unexpected complication a smooth invented account wouldn't think to include (the dead flash), and an admitted gap ("I didn't check") rather than false precision. Sentence length varies sharply, one long scene-setting sentence, then short and medium ones, per the layered skill's burstiness rule and Section 9's presence principle, rather than settling into the uniform mid-length rhythm generated text defaults to. Zero em dashes, per both the layered skill's hard rule and Section 1's typographic default. The close is a flat, quiet fact instead of a generic positive conclusion (Cluster D), which is the layered skill's own "solution is the hero, not the victim" instinct doing the same work Section 9 asks for from a different direction.

What it does

  • An explicit own-style-or-default choice, not a default assumption. Choosing your own style requires a real writing sample of at least 100 words, an essay, article, post, or email you actually wrote; under that, the skill says so and asks for more rather than guessing from a fragment. Adjectives alone ("direct, a little dry") don't satisfy either path. Choosing default skips the personal fingerprint and keeps every plain-style and typographic default in force.
  • A stylometric voice fingerprint, not a one-shot style match: function-word habits, sentence-length variance, opening patterns, and the writer's own recurring bigrams and trigrams, read from a real sample and kept for the rest of the conversation.
  • Orwell's plain-style check, applied as a live diagnostic: dying metaphors, verbal false limbs, pretentious diction, and meaningless words, the same four faults named in 1946, with current examples.
  • Five clusters of structural patterns beyond Orwell's essay: borrowed authority, decorative structure, borrowed register, hedging and throat-clearing, and mechanical uniformity, covering everything from significance inflation and promotional language to stacked hedging, throat-clearing openers, and uniform transition-word rotation across a whole document. See Coverage below for the full pattern list.
  • A hard zero-default on em and en dashes, not just "use sparingly": the finished draft is scanned for , , and their spaced/doubled-hyphen equivalents before delivery, unless a real voice sample shows the writer actually uses them, in which case the sample wins outright.
  • A formulaic-language swap, not a ban. Pre-formed phrasing is normal and necessary for fluent writing; the skill directs it toward the writer's own recurring phrases instead of shared clichés.
  • A specificity test drawn from forensic content analysis: contextual embedding, unexpected complications, reproduced (not summarized) conversation, and admitted gaps, the actual criteria used to distinguish genuine accounts from fabricated ones, repurposed as a construction checklist.
  • Presence, not just absence. Stripping every flagged pattern out and putting nothing back produces sterile prose, a different failure with the same symptom. Once a voice fingerprint exists, the skill writes toward it: uneven rhythm, real stance, unresolved mixed feelings, genuine self-correction, gated by content type and bounded by the no-fabrication rule throughout.
  • Platform-specific structure: Context-Core-Connect for LinkedIn and Substack, hook-plus-white-space for X and Threads, tight distillation for email and Slack.
  • Three invocation modes: pasted text (draft plus notes on what changed), file mode (rewrites a file in place, prose only), and embedded mode (bare final text for another agent or task using this skill as one step of a larger job).
  • An honest engagement gate. Rapport techniques that work by being honest are always available. Techniques that work by deceiving the reader are gated to disclosed, consensual contexts, not applied by default to published, audience-facing content. See references/engagement-ethics.md.
  • Verified detection science, not fabricated statistics.references/detection-science.md documents a citation-fabrication finding caught and excluded during research, and why current classifier-based detectors make surface-level evasion a weaker strategy than genuine specificity.

Coverage against Wikipedia's "Signs of AI writing" guide

The primary source for Bespoke's pattern taxonomy is Wikipedia's "Signs of AI writing" guide, maintained by WikiProject AI Cleanup from real examples observed across Wikipedia articles, drafts, and comments. See References below. That guide is broader than Bespoke's scope in one direction, it documents Wikipedia-specific markup and citation mechanics (broken wikitext, invalid DOIs, utm_source parameters, non-existent templates, skipped heading levels, and similar), none of which apply to general prose and none of which Bespoke checks. The table below covers the guide's Content, Language and Grammar, Style, and Communication sections, the parts that generalize to any writing, and where each lives in Bespoke.

The guide's general-prose patterns, and where they live in Bespoke

Wikipedia's patternWhere it lives in Bespoke
Undue emphasis on significance, legacy, and broader trendsplain-style-diagnostics.md, Fault 1, "Significance and legacy inflation"
Canned emphasis on notability, attribution, and media coverageplain-style-diagnostics.md, Cluster A, "Notability namedropping"
Superficial analysesplain-style-diagnostics.md, "Padding at the paragraph level"
Promotional and advertisement-like languageplain-style-diagnostics.md, Fault 1, "Promotional and brochure language"
Vague attributions and overgeneralization of opinionsplain-style-diagnostics.md, Cluster A, "Vague attribution"
Outline-like conclusions about challenges and future prospectsplain-style-diagnostics.md, "Padding at the paragraph level"
High density of "AI vocabulary" wordsplain-style-diagnostics.md, Fault 3, tied to SKILL.md Section 1's frequency framing
Avoidance of basic copulatives ("is"/"are")plain-style-diagnostics.md, Cluster B, "Copula avoidance"
Negative parallelisms (three subtypes)plain-style-diagnostics.md, Cluster B
Rule of threeplain-style-diagnostics.md, Cluster B
Lexical diversity / elegant variationplain-style-diagnostics.md, Cluster B, "Synonym cycling"
Title casetypographic-markers.md
Overuse of boldfacetypographic-markers.md
Inline-header vertical liststypographic-markers.md
Overuse of em dashestypographic-markers.md — hard zero-default, not "use sparingly"
Emoji as formattingtypographic-markers.md
Curly quotation markstypographic-markers.md
Collaborative communicationplain-style-diagnostics.md, Cluster C, "Chatbot artifacts"
Knowledge-cutoff disclaimersSKILL.md Section 4, folded into the specificity test rather than a word list
Phrasal templates and placeholder textSKILL.md Section 4, the specificity test's placeholder guidance

A few of the guide's Style-section items are Wikipedia-article conventions with no general-prose analog (title-heading formatting, skipped heading levels, level-1-heading overuse, thematic breaks between sections, unusual table use) and aren't in the table above for that reason, not because they're uncovered by oversight.

Patterns and features Bespoke has beyond the Wikipedia guide

  • Definitional throat-clearing openers ("X refers to..." used to warm up a paragraph before the real point) — plain-style-diagnostics.md, Cluster D.
  • Recap and meta-commentary closings ("In summary," "to conclude," restating what a piece already said) — Cluster D.
  • Uniform transition-word rotation (mechanically cycling However / Moreover / Furthermore / Additionally across paragraphs) — Cluster E.
  • Structural symmetry addiction (every section forced to the same paragraph count regardless of what the content needs) — Cluster E.
  • Frequency-based AI-vocabulary detection tied to stylometry. The wider AI-vocabulary list under Fault 3 is explicitly framed as an anomalous-rate signal connected to SKILL.md Section 1's function-word fingerprinting, not a flat banned-word list, so a single instance of a listed word isn't treated as a violation on its own.
  • Presence, not just absence (SKILL.md Section 9). Removing every flagged pattern and adding nothing back is a different failure with the same symptom as generated prose. Once a voice fingerprint exists, the skill actively writes toward it: uneven rhythm, real stance, unresolved mixed feelings, genuine self-correction, bounded by the no-fabrication rule throughout.
  • A stylometric voice fingerprint built from a real sample, kept and updated across a whole conversation rather than applied once per rewrite (SKILL.md Section 1), grounded in the same authorship-attribution research used in forensic linguistics.
  • A specificity test from forensic content-analysis criteria (CBCA, Reality Monitoring) for distinguishing genuine detail from plausible-sounding invention, not just an AI-tell scan (SKILL.md Section 4).
  • An honest-engagement gate on rapport techniques that work by deceiving the reader, restricted to disclosed, consensual contexts rather than applied by default (references/engagement-ethics.md).
  • Verified, sourced detection science, including a documented citation-fabrication finding caught and excluded during this project's own research (references/detection-science.md).

Repository structure

bespoke/
├── SKILL.md # the skill itself; source of truth
├── README.md # this file
├── AGENTS.md # guidance for agents/contributors editing this repo
├── LICENSE # MIT
├── .claude-plugin/
│ ├── plugin.json # Claude Code plugin manifest
│ └── marketplace.json # single-repo marketplace entry
├── .github/workflows/validate.yml # CI: runs the same checks below on every push
├── scripts/
│ └── validate_package.py # dependency-free sync checks (stdlib only)
└── references/
├── plain-style-diagnostics.md
├── typographic-markers.md
├── detection-science.md
├── engagement-ethics.md
└── changelog.md

Validating a local copy

python3 scripts/validate_package.py

Stdlib only, no pip install required. Checks that SKILL.md's name and version match .claude-plugin/plugin.json, that every file SKILL.md points to under references/ actually exists, and that the marketplace entry resolves.

Version history

  • 2.4.0 — Corrected the pattern taxonomy's primary-source attribution: references/plain-style-diagnostics.md's Clusters A through C now cite Wikipedia's "Signs of AI writing" guide directly, verified against the live page, rather than being attributed by way of blader/humanizer, which is itself downstream of that same guide. New README "References" section citing the Wikipedia guide and WikiProject AI Cleanup, its maintaining organization, without claiming any project affiliation beyond citation. The "Coverage" section is rebuilt against the guide's own Content, Language and Grammar, Style, and Communication sections (with its Wikipedia-specific markup and citation items explicitly noted as out of scope) rather than humanizer's numbered list. blader/humanizer now appears only in Credits, as the tool early development was benchmarked against. See references/changelog.md.
  • 2.3.0 — Made the Voice intake an explicit own-style-or-default choice rather than a default sample-or-adjectives request. Choosing own style now requires a real writing sample of at least 100 words, with an explicit ask for more if under that floor; adjectives alone no longer satisfy either path. Choosing default explicitly waives a personal fingerprint while keeping every plain-style and typographic default in force. New "The own-style-or-default gate" subsection in SKILL.md Section 1; intake item 1 and the Usage/"What it does" sections of this README updated to match. No change to any pattern in plain-style-diagnostics.md or typographic-markers.md. See references/changelog.md.
  • 2.2.1 — Added "Before / after example 2" to this README: a short, fictional, non-identifying personal narrative run through the installed skill with Voice pre-filled by a separate fixed personal-voice skill per Section 8, demonstrating Sections 1 and 4 (voice fingerprint, specificity test) on unformatted prose rather than the mostly structural/typographic first example. README-only; no change to SKILL.md or any pattern file. See references/changelog.md.
  • 2.2.0 — Full audit against blader/humanizer v2.9.1's complete 33-pattern taxonomy (see Coverage above). Closed every remaining gap: significance/legacy inflation and promotional/brochure language (Fault 1), the full high-frequency AI-vocabulary list tied to Section 1's stylometry framing (Fault 3), passive voice and subjectless fragments as a named pattern (Fault 2), filler phrases as an explicit stock list (Fault 2), and two new clusters, D (hedging, throat-clearing, and empty closes) and E (mechanical uniformity), the latter with no equivalent in humanizer's taxonomy. Hardened the em-dash default from "rare" to a zero-default with a pre-delivery scan, matching humanizer's hard-constraint treatment while keeping the sample-override principle. Added SKILL.md Section 9 ("Presence, not just absence") on actively writing toward the voice fingerprint rather than only scrubbing tells, Section 10 (invocation modes: pasted text, file, embedded), and an explicit two-question self-audit step in the Application workflow. Expanded plain-style-diagnostics.md's false-positive guidance from 4 items to 15. Added a before/after example and the coverage table above to this README. See references/changelog.md for the full audit account.
  • 2.1.0 — Closed a coverage gap found during a direct comparison against the tool this skill was originally benchmarked against: added typography and formatting as voice-fingerprint markers (references/typographic-markers.md) and three clusters of structural patterns (borrowed authority, decorative structure, borrowed register) to references/plain-style-diagnostics.md. Also fixed a stale internal section cross-reference. See references/changelog.md for the specific patterns added and why each was placed where it was.
  • 2.0.0 — Rebuilt around independent research (stylometry, Orwell's plain-style diagnostics, formulaic-language psycholinguistics, forensic content-analysis criteria) rather than a comparative audit of an existing tool. See references/changelog.md for the full account of what changed and why.
  • 1.0.0 — Initial release, built after benchmarking against an existing AI-tell removal tool. Superseded by 2.0.0's independent research base.

License

MIT. See LICENSE.

References

  • Wikipedia: Signs of AI writing — primary source for the pattern taxonomy in references/plain-style-diagnostics.md's Clusters A through C and references/typographic-markers.md. See Coverage above for the section-by-section mapping.
  • WikiProject AI Cleanup — the Wikipedia project that maintains the guide above.

Credits

Early development benchmarked against blader/humanizer (MIT), an existing open-source AI-tell removal skill that itself cites the Wikipedia guide above as its own primary source. Bespoke's current structure is built from independent research (see references/changelog.md); this credit reflects where the project started, not its present design or its present sourcing.

About

Agent skill that helps you mold AI-generated writing into your own authentic voice, grounded in stylometry, plain-style principles, and forensic content analysis.

Topics

Resources

Stars

1 star

Watchers

0 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

Repository files navigation

Bespoke

A portable agent skill that builds writing from a specific person's real voice, grounded in four established, independent bodies of research rather than a fixed list of banned phrases:

  • Stylometry and authorship attribution for what an individual's actual linguistic fingerprint consists of (function words, sentence-length variance, recurring phrase patterns), the same class of evidence used in forensic authorship analysis since the statistical study of the disputed Federalist Papers.
  • Orwell's plain-style diagnostics, from "Politics and the English Language" (1946), for a principled account of why prefabricated phrasing reads as hollow, eight decades before anything resembling AI-generated text existed.
  • Formulaic-language psycholinguistics, for why the goal is swapping shared, generic phrasing for a writer's own recurring language, not eliminating pre-formed phrasing altogether.
  • Forensic content-analysis criteria (Criteria-Based Content Analysis and Reality Monitoring) for what distinguishes genuine, specific, lived detail from plausible-sounding invention.

It is plain Markdown with zero external dependencies: no API keys, no build step, nothing to install to use it. Full sourcing for all four is in references/.

Installation

Skills CLI

Install with the cross-agent skills CLI:

npx skills add blisse-code/bespoke --global

Update an existing install:

npx skills update bespoke --global

To install into every supported agent harness on your machine:

npx skills add blisse-code/bespoke --global --agent '*'

Omit --global for a project-local install that can be committed and shared with collaborators.

Claude Code plugin

/plugin marketplace add blisse-code/bespoke
/plugin install bespoke@bespoke

The skill is then invoked as /bespoke:bespoke.

Manual

Any agent harness can use the skill directly because the runtime artifact is SKILL.md. Copy it, and the references/ folder alongside it, into wherever your harness expects skill directories:

git clone https://github.com/blisse-code/bespoke.git /path/to/your/skills/bespoke

Or, if you already have this repo cloned:

mkdir -p /path/to/your/skills/bespoke
cp -r SKILL.md references /path/to/your/skills/bespoke/

Claude.ai

Upload SKILL.md and the references/ folder as a .skill file (zip the repo, excluding .git, .github, and .claude-plugin) through Settings → Capabilities → Skills.

Usage

Invoke however your harness exposes installed skills. Common forms:

/bespoke
Write in my voice: [paste a LinkedIn post topic]
Humanize this: [paste AI-sounding text]

The skill opens with a short intake if it doesn't already know your voice, platform, audience, and intention for the piece. Voice is an explicit choice, your own style or Bespoke's default, not a request for adjectives:

Voice: own style
[paste at least 100 words of your own past writing, an essay,
article, post, or email you actually wrote]
Task: LinkedIn post about a product launch delay
Audience: my team and a few clients who are already annoyed
Intention: own the delay without sounding defensive

From a real sample like that, Bespoke reads sentence-length pattern, function-word habits, and recurring phrases (Section 1) rather than working from a self-description. The profile that comes out of one might read, in Bespoke's own shorthand, as something like "direct, a little dry, no corporate hedging", but that's Bespoke's inference from your material, not something you type in yourself. Under 100 words, it'll ask for more before building anything from it. Say Voice: default instead to skip a personal fingerprint entirely and get Sections 2 through 4's plain-style discipline without one.

Before / after example 1: structural and typographic tells

(Illustration note: the "before" is a representative generic-AI-written passage, not a real product announcement. The "after" applies the voice profile from the intake example above, direct, a little dry, no corporate hedging, and adds a few concrete specifics, like "three teams asked" and "check Settings," that stand in for the kind of real detail a user would supply in an actual session. Bespoke doesn't invent those in practice; it asks for them or leaves the sentence plain. See Section 4's specificity test.)

Before (generic AI-written text):

🚀 Introducing Smart Scheduling: A Game-Changer for Your Workflow

We're thrilled to announce the launch of Smart Scheduling, a feature that stands as a testament to our commitment to innovation, efficiency, and user delight. This pivotal update marks a key turning point in our platform's evolving landscape.

Intelligent Automation: Intelligent automation ensures your calendar stays perfectly organized. Seamless Integration: Seamless integration means Smart Scheduling works effortlessly with the tools you already love. Real-Time Sync: Real-time sync keeps everyone — teammates, clients, and stakeholders — on the exact same page.

In order to fully leverage this robust new capability, users simply need to enable it in Settings. It could potentially possibly make a meaningful difference for teams juggling multiple calendars.

Additionally, Smart Scheduling isn't just a tool — it's a philosophy. It's not about saving time, it's about giving that time back to what truly matters. Whether you're a solo founder, a growing startup, or an established enterprise, Smart Scheduling has something for everyone.

We hope this helps streamline your day! Let us know if you have any questions — we'd love to hear from you. 🎉

Overall, we're incredibly excited about what this means for the future. The road ahead looks bright, and we can't wait to see what you build next.

After (Bespoke rewrite):

Smart Scheduling is live. Check Settings to turn it on.

It syncs your calendar with the tools you're already using, so teammates, clients, and anyone else on the invite are looking at the same times. No import step, no separate app to check.

We built it because three teams asked for the same thing in one month: stop making them reconcile two calendars by hand. If that's not your problem, you probably won't notice this update, and that's fine.

Turn it on and tell us what breaks.

Every pattern in the "before" maps to a specific rule this skill applies: the heading trades Title Case and an emoji for plain sentence case with no decoration; "stands as a testament to... innovation, efficiency, and user delight" (a dying metaphor stacked with rule-of-three padding) becomes nothing, because the fact that the feature exists doesn't need a legacy claim; the bolded inline-header list collapses into two plain sentences; "in order to fully leverage this robust... capability" (a filler phrase plus pretentious diction) becomes "so"; "could potentially possibly" (stacked hedging) becomes a specific, sourced reason instead of a hedge; the em dashes are gone; and the closing "Overall, we're incredibly excited..." (a generic positive conclusion) is replaced by an actual next step. See Coverage below for where each pattern lives in the skill.

Before / after example 2: voice and specificity, layered with a fixed personal-voice skill

The first example shows structural and typographic tells getting removed from a formatted document. This one shows the other half of the skill, Sections 1 and 4, working on a short, unformatted personal narrative, and demonstrates Section 8: layering Bespoke under a separate, fixed personal-voice skill rather than using Bespoke's generic defaults.

(Illustration note: this is a fictional narrative written to demonstrate the skill, not a real account, and doesn't depict any real, identifiable person. The "before" is a short, deliberately generic AI-written passage. For the "after," Bespoke's own intake (Section "The intake") was pre-filled per Section 8 by an existing fixed-voice skill, no em dashes, zero cap on unsupported facts, an "acid test" against real named entities, burstiness, grade 6-7 readability, restrained tone, no performed vulnerability, a quiet close over a dramatic one, rather than by a fresh sample. The specific narrative details below, the street name, the dialogue, the dead flash, are illustrative texture standing in for what a real user's own material would supply; see Section 4's specificity test for why a rewrite shouldn't invent this kind of detail about something that actually happened.)

Before (generic AI-written text, 199 characters):

Nestled in the vibrant heart of Kuala Lumpur, an unofficial date with a stunning model blossomed into an unforgettable, impromptu photoshoot, a testament to genuine chemistry and effortless artistry.

After (Bespoke rewrite, voice layered from a fixed personal-voice skill):

Met her at a rooftop bar off Jalan Alor on a Tuesday, the kind of humid Kuala Lumpur night that turns any jacket into a mistake by nine. She modeled part-time, she said, mostly for local streetwear brands. I brought a camera out of habit, not intent.

Two drinks in, she picked it up, turned it over, and said, "so are you going to use this or just carry it around."

We ended up on the street outside for maybe twenty minutes, I didn't check. Streetlights and a wet road did most of the work. My flash died halfway through. Neither of us minded.

What changed and why: "nestled in the vibrant heart of," "blossomed into," and "a testament to genuine chemistry and effortless artistry" (Fault 1's dying metaphors and promotional-language sub-family) are gone entirely rather than trimmed, because the plain fact underneath them, two people met, ended up taking pictures, doesn't need a frame telling the reader how to feel about it. In their place: a specific street and night (Section 4's contextual embedding), reproduced dialogue instead of summary ("she asked about the camera" would be the generic version), an unexpected complication a smooth invented account wouldn't think to include (the dead flash), and an admitted gap ("I didn't check") rather than false precision. Sentence length varies sharply, one long scene-setting sentence, then short and medium ones, per the layered skill's burstiness rule and Section 9's presence principle, rather than settling into the uniform mid-length rhythm generated text defaults to. Zero em dashes, per both the layered skill's hard rule and Section 1's typographic default. The close is a flat, quiet fact instead of a generic positive conclusion (Cluster D), which is the layered skill's own "solution is the hero, not the victim" instinct doing the same work Section 9 asks for from a different direction.

What it does

  • An explicit own-style-or-default choice, not a default assumption. Choosing your own style requires a real writing sample of at least 100 words, an essay, article, post, or email you actually wrote; under that, the skill says so and asks for more rather than guessing from a fragment. Adjectives alone ("direct, a little dry") don't satisfy either path. Choosing default skips the personal fingerprint and keeps every plain-style and typographic default in force.
  • A stylometric voice fingerprint, not a one-shot style match: function-word habits, sentence-length variance, opening patterns, and the writer's own recurring bigrams and trigrams, read from a real sample and kept for the rest of the conversation.
  • Orwell's plain-style check, applied as a live diagnostic: dying metaphors, verbal false limbs, pretentious diction, and meaningless words, the same four faults named in 1946, with current examples.
  • Five clusters of structural patterns beyond Orwell's essay: borrowed authority, decorative structure, borrowed register, hedging and throat-clearing, and mechanical uniformity, covering everything from significance inflation and promotional language to stacked hedging, throat-clearing openers, and uniform transition-word rotation across a whole document. See Coverage below for the full pattern list.
  • A hard zero-default on em and en dashes, not just "use sparingly": the finished draft is scanned for , , and their spaced/doubled-hyphen equivalents before delivery, unless a real voice sample shows the writer actually uses them, in which case the sample wins outright.
  • A formulaic-language swap, not a ban. Pre-formed phrasing is normal and necessary for fluent writing; the skill directs it toward the writer's own recurring phrases instead of shared clichés.
  • A specificity test drawn from forensic content analysis: contextual embedding, unexpected complications, reproduced (not summarized) conversation, and admitted gaps, the actual criteria used to distinguish genuine accounts from fabricated ones, repurposed as a construction checklist.
  • Presence, not just absence. Stripping every flagged pattern out and putting nothing back produces sterile prose, a different failure with the same symptom. Once a voice fingerprint exists, the skill writes toward it: uneven rhythm, real stance, unresolved mixed feelings, genuine self-correction, gated by content type and bounded by the no-fabrication rule throughout.
  • Platform-specific structure: Context-Core-Connect for LinkedIn and Substack, hook-plus-white-space for X and Threads, tight distillation for email and Slack.
  • Three invocation modes: pasted text (draft plus notes on what changed), file mode (rewrites a file in place, prose only), and embedded mode (bare final text for another agent or task using this skill as one step of a larger job).
  • An honest engagement gate. Rapport techniques that work by being honest are always available. Techniques that work by deceiving the reader are gated to disclosed, consensual contexts, not applied by default to published, audience-facing content. See references/engagement-ethics.md.
  • Verified detection science, not fabricated statistics.references/detection-science.md documents a citation-fabrication finding caught and excluded during research, and why current classifier-based detectors make surface-level evasion a weaker strategy than genuine specificity.

Coverage against Wikipedia's "Signs of AI writing" guide

The primary source for Bespoke's pattern taxonomy is Wikipedia's "Signs of AI writing" guide, maintained by WikiProject AI Cleanup from real examples observed across Wikipedia articles, drafts, and comments. See References below. That guide is broader than Bespoke's scope in one direction, it documents Wikipedia-specific markup and citation mechanics (broken wikitext, invalid DOIs, utm_source parameters, non-existent templates, skipped heading levels, and similar), none of which apply to general prose and none of which Bespoke checks. The table below covers the guide's Content, Language and Grammar, Style, and Communication sections, the parts that generalize to any writing, and where each lives in Bespoke.

The guide's general-prose patterns, and where they live in Bespoke

Wikipedia's patternWhere it lives in Bespoke
Undue emphasis on significance, legacy, and broader trendsplain-style-diagnostics.md, Fault 1, "Significance and legacy inflation"
Canned emphasis on notability, attribution, and media coverageplain-style-diagnostics.md, Cluster A, "Notability namedropping"
Superficial analysesplain-style-diagnostics.md, "Padding at the paragraph level"
Promotional and advertisement-like languageplain-style-diagnostics.md, Fault 1, "Promotional and brochure language"
Vague attributions and overgeneralization of opinionsplain-style-diagnostics.md, Cluster A, "Vague attribution"
Outline-like conclusions about challenges and future prospectsplain-style-diagnostics.md, "Padding at the paragraph level"
High density of "AI vocabulary" wordsplain-style-diagnostics.md, Fault 3, tied to SKILL.md Section 1's frequency framing
Avoidance of basic copulatives ("is"/"are")plain-style-diagnostics.md, Cluster B, "Copula avoidance"
Negative parallelisms (three subtypes)plain-style-diagnostics.md, Cluster B
Rule of threeplain-style-diagnostics.md, Cluster B
Lexical diversity / elegant variationplain-style-diagnostics.md, Cluster B, "Synonym cycling"
Title casetypographic-markers.md
Overuse of boldfacetypographic-markers.md
Inline-header vertical liststypographic-markers.md
Overuse of em dashestypographic-markers.md — hard zero-default, not "use sparingly"
Emoji as formattingtypographic-markers.md
Curly quotation markstypographic-markers.md
Collaborative communicationplain-style-diagnostics.md, Cluster C, "Chatbot artifacts"
Knowledge-cutoff disclaimersSKILL.md Section 4, folded into the specificity test rather than a word list
Phrasal templates and placeholder textSKILL.md Section 4, the specificity test's placeholder guidance

A few of the guide's Style-section items are Wikipedia-article conventions with no general-prose analog (title-heading formatting, skipped heading levels, level-1-heading overuse, thematic breaks between sections, unusual table use) and aren't in the table above for that reason, not because they're uncovered by oversight.

Patterns and features Bespoke has beyond the Wikipedia guide

  • Definitional throat-clearing openers ("X refers to..." used to warm up a paragraph before the real point) — plain-style-diagnostics.md, Cluster D.
  • Recap and meta-commentary closings ("In summary," "to conclude," restating what a piece already said) — Cluster D.
  • Uniform transition-word rotation (mechanically cycling However / Moreover / Furthermore / Additionally across paragraphs) — Cluster E.
  • Structural symmetry addiction (every section forced to the same paragraph count regardless of what the content needs) — Cluster E.
  • Frequency-based AI-vocabulary detection tied to stylometry. The wider AI-vocabulary list under Fault 3 is explicitly framed as an anomalous-rate signal connected to SKILL.md Section 1's function-word fingerprinting, not a flat banned-word list, so a single instance of a listed word isn't treated as a violation on its own.
  • Presence, not just absence (SKILL.md Section 9). Removing every flagged pattern and adding nothing back is a different failure with the same symptom as generated prose. Once a voice fingerprint exists, the skill actively writes toward it: uneven rhythm, real stance, unresolved mixed feelings, genuine self-correction, bounded by the no-fabrication rule throughout.
  • A stylometric voice fingerprint built from a real sample, kept and updated across a whole conversation rather than applied once per rewrite (SKILL.md Section 1), grounded in the same authorship-attribution research used in forensic linguistics.
  • A specificity test from forensic content-analysis criteria (CBCA, Reality Monitoring) for distinguishing genuine detail from plausible-sounding invention, not just an AI-tell scan (SKILL.md Section 4).
  • An honest-engagement gate on rapport techniques that work by deceiving the reader, restricted to disclosed, consensual contexts rather than applied by default (references/engagement-ethics.md).
  • Verified, sourced detection science, including a documented citation-fabrication finding caught and excluded during this project's own research (references/detection-science.md).

Repository structure

bespoke/
├── SKILL.md # the skill itself; source of truth
├── README.md # this file
├── AGENTS.md # guidance for agents/contributors editing this repo
├── LICENSE # MIT
├── .claude-plugin/
│ ├── plugin.json # Claude Code plugin manifest
│ └── marketplace.json # single-repo marketplace entry
├── .github/workflows/validate.yml # CI: runs the same checks below on every push
├── scripts/
│ └── validate_package.py # dependency-free sync checks (stdlib only)
└── references/
├── plain-style-diagnostics.md
├── typographic-markers.md
├── detection-science.md
├── engagement-ethics.md
└── changelog.md

Validating a local copy

python3 scripts/validate_package.py

Stdlib only, no pip install required. Checks that SKILL.md's name and version match .claude-plugin/plugin.json, that every file SKILL.md points to under references/ actually exists, and that the marketplace entry resolves.

Version history

  • 2.4.0 — Corrected the pattern taxonomy's primary-source attribution: references/plain-style-diagnostics.md's Clusters A through C now cite Wikipedia's "Signs of AI writing" guide directly, verified against the live page, rather than being attributed by way of blader/humanizer, which is itself downstream of that same guide. New README "References" section citing the Wikipedia guide and WikiProject AI Cleanup, its maintaining organization, without claiming any project affiliation beyond citation. The "Coverage" section is rebuilt against the guide's own Content, Language and Grammar, Style, and Communication sections (with its Wikipedia-specific markup and citation items explicitly noted as out of scope) rather than humanizer's numbered list. blader/humanizer now appears only in Credits, as the tool early development was benchmarked against. See references/changelog.md.
  • 2.3.0 — Made the Voice intake an explicit own-style-or-default choice rather than a default sample-or-adjectives request. Choosing own style now requires a real writing sample of at least 100 words, with an explicit ask for more if under that floor; adjectives alone no longer satisfy either path. Choosing default explicitly waives a personal fingerprint while keeping every plain-style and typographic default in force. New "The own-style-or-default gate" subsection in SKILL.md Section 1; intake item 1 and the Usage/"What it does" sections of this README updated to match. No change to any pattern in plain-style-diagnostics.md or typographic-markers.md. See references/changelog.md.
  • 2.2.1 — Added "Before / after example 2" to this README: a short, fictional, non-identifying personal narrative run through the installed skill with Voice pre-filled by a separate fixed personal-voice skill per Section 8, demonstrating Sections 1 and 4 (voice fingerprint, specificity test) on unformatted prose rather than the mostly structural/typographic first example. README-only; no change to SKILL.md or any pattern file. See references/changelog.md.
  • 2.2.0 — Full audit against blader/humanizer v2.9.1's complete 33-pattern taxonomy (see Coverage above). Closed every remaining gap: significance/legacy inflation and promotional/brochure language (Fault 1), the full high-frequency AI-vocabulary list tied to Section 1's stylometry framing (Fault 3), passive voice and subjectless fragments as a named pattern (Fault 2), filler phrases as an explicit stock list (Fault 2), and two new clusters, D (hedging, throat-clearing, and empty closes) and E (mechanical uniformity), the latter with no equivalent in humanizer's taxonomy. Hardened the em-dash default from "rare" to a zero-default with a pre-delivery scan, matching humanizer's hard-constraint treatment while keeping the sample-override principle. Added SKILL.md Section 9 ("Presence, not just absence") on actively writing toward the voice fingerprint rather than only scrubbing tells, Section 10 (invocation modes: pasted text, file, embedded), and an explicit two-question self-audit step in the Application workflow. Expanded plain-style-diagnostics.md's false-positive guidance from 4 items to 15. Added a before/after example and the coverage table above to this README. See references/changelog.md for the full audit account.
  • 2.1.0 — Closed a coverage gap found during a direct comparison against the tool this skill was originally benchmarked against: added typography and formatting as voice-fingerprint markers (references/typographic-markers.md) and three clusters of structural patterns (borrowed authority, decorative structure, borrowed register) to references/plain-style-diagnostics.md. Also fixed a stale internal section cross-reference. See references/changelog.md for the specific patterns added and why each was placed where it was.
  • 2.0.0 — Rebuilt around independent research (stylometry, Orwell's plain-style diagnostics, formulaic-language psycholinguistics, forensic content-analysis criteria) rather than a comparative audit of an existing tool. See references/changelog.md for the full account of what changed and why.
  • 1.0.0 — Initial release, built after benchmarking against an existing AI-tell removal tool. Superseded by 2.0.0's independent research base.

License

MIT. See LICENSE.

References

  • Wikipedia: Signs of AI writing — primary source for the pattern taxonomy in references/plain-style-diagnostics.md's Clusters A through C and references/typographic-markers.md. See Coverage above for the section-by-section mapping.
  • WikiProject AI Cleanup — the Wikipedia project that maintains the guide above.

Credits

Early development benchmarked against blader/humanizer (MIT), an existing open-source AI-tell removal skill that itself cites the Wikipedia guide above as its own primary source. Bespoke's current structure is built from independent research (see references/changelog.md); this credit reflects where the project started, not its present design or its present sourcing.

About

Agent skill that helps you mold AI-generated writing into your own authentic voice, grounded in stylometry, plain-style principles, and forensic content analysis.

Topics

Resources

Stars

1 star

Watchers

0 watching

Forks

Releases

Packages

Used by

Contributors

Languages