content-audit
Skill9 starsChanged 7 days agoMITView on GitHub
Audit prose against content-design.md for AI-writing tells, voice violations, and register mismatches. Use when asked to audit copy, check content quality, review prose for AI slop, or check writing against the content guide.
25 other projects use a version of this, 1 of them edited.
Adopted by
Most recently taken up by
- risukisu/marketing-skillstheir own version, first seen Nov 8, 2026
- striderZA/OpenCodeGameStudiostheir own version, first seen Nov 4, 2026
- brainbytes-dev/everything-claude-marketingtheir own version, first seen Nov 1, 2026
- robritacca-dotcom/design-systemedited, first seen Oct 28, 2026
- microsoft/frontier-ghcp-rvastheir own version, first seen Oct 25, 2026
- huifer/AdSense-Readiness-Benchmarktheir own version, first seen Oct 25, 2026
Used with
Projects with it also use asset-spec, create-control-manifest and 10 more.
Other files people use alongside this one.
Files found in the same public projects as a version of this one, more often than they turn up anywhere else. Each project counts once, large collections count for less, and this file's own repository is left out.
lilangMaxSkillasset-spec
Generate per-asset visual specifications and AI generation prompts from GDDs, level docs, or character profiles. Produces structured spec files and updates the master asset manifest. Run after art bible and GDD/level design are approved, before production begins.
Also in 10 projects that use this
lilangMaxSkillcreate-control-manifest
After architecture is complete, produces a flat actionable rules sheet for programmers — what you must do, what you must never do, per system and per layer. Extracted from all Accepted ADRs, technical preferences, and engine reference docs. More immediately actionable than ADRs (which explain why).
Also in 10 projects that use this
- +10 more from lilangMax
Other versions25 projects use a version of this.
Word for word · 0
None found.
Edited · 1
- robritacca-dotcom/design-system★ 174% same
Wrote their own version · 24
- Donchitos/Claude-Code-Game-Studios★ 27ksame name
- Ootto-AI/claude-content-skills★ 417same name
- OffchainLabs/arbitrum-docs★ 252same name
- striderZA/OpenCodeGameStudios★ 118same name
- cenconq25/claude-code-app-studio★ 40same name
- dawn840705/codex-code-studios★ 17same name
- huifer/AdSense-Readiness-Benchmark★ 14same name
- brainbytes-dev/everything-claude-marketing★ 9same name
- lilangMax/ClaudeCodeGameStudios★ 8same name
- greglas75/zuvo★ 7same name
14 more not listed
How matches are found. Word for word: the exact same text. Edited: shares passages with this file (“99% same” means 99% of its five-word phrases also appear here; 10% or more counts). Their own version: similar meaning, or, weakest, the same name. We can’t tell which project had it first. Projects are counted among the 200 most-starred candidates, and mentions are links to the repository we found, up to 50 per site, so both counts are a floor.
In this repository33 other files it gives its agents.
- CLAUDE.mdCLAUDE.md
- accessibility-auditSkill
- animation-jump-checkSkill
- api-consistencySkill
- chat-qualitySkill
- checkpointSkill
- component-consistency-auditSkill
- component-doc-pageSkill
- dependency-advisorySkill
- design-qaSkill
- dogfoodSkill
- drift-auditSkill
- first-deploySkill
- landSkill
- link-rotSkill
- new-componentSkill
- new-pageSkill
- new-presetSkill
- new-templateSkill
- new-tokenSkill
- new-validatorSkill
- parkSkill
- pre-deploySkill
- release-postSkill
- releaseSkill
- responsive-sweepSkill
- security-auditSkill
- seo-auditSkill
- shipSkill
- super-shipSkill
- token-auditSkill
- token-renameSkill
- visual-reviewSkill
The file
We split this skill into the rules it gives an agent
3 rules. 0 are common, 3 are distinctive, and 0 are very specific to this project.
0
Common
Most of the 24 edited versions we read keep these.
3
Distinctive
This author's own choices. Worth a look.
0
Very specific
Tied to their project's names, files or tools. Probably skip.
- Common
- Distinctive
- Very specific
- Distinctive: line 15
Use this skill when asked to audit copy, check prose quality, find AI-writing tells, or review text against the content guide — phrases …
- Distinctive: line 77
If nothing is found: "No content violations found.
- Distinctive: line 78
Run the guide's Self-Review Tests over the longest passage in scope and report the result, pass or fail
“Common” is measured: kept by at least 6 in 10 of the 24 edited versions of this file we could read. “Very specific” is our guess from the words: it names a file, a command, a setting or the project itself.
Files
content-audit
Audit prose against content-design.md, and report violations with suggested rewrites.
When invoked
Use this skill when asked to audit copy, check prose quality, find AI-writing tells, or review text against the content guide — phrases like "content audit", "audit the copy on the homepage", "does this read like AI", "check this against content-design.md".
Instructions
- Determine scope. Accept one of:
- A specific file path (a page, a data file, a markdown doc)
release-log→website/src/data/release-log.json(titles + story bodies, plus the predecessor versions' one-line summaries)registry→ thedescriptionfields insrc/components/registry.json, and the chat widget'sdescriptionand per-subpath strings insrc/chat/registry.json(rendered on its component page and served by MCP)package-meta→ the npm package description:PACKAGE_DESCRIPTIONinscripts/package-manifest.mjs, mirrored into the rootpackage.json(renders on the npmjs.com package page — its register row calls it production copy at the README's bar; no validator judges its prose, and thereadmescope never reaches it)corpus-prose→ the hand-written connective paragraphs insidescripts/generate-site-corpus.mjs(the chat model can repeat any of them verbatim to a visitor — its register row holds them to the page-prose bar; the corpus validators screen for leaks, never for voice, so the judgement rules stay this scope's. Fix the generator's strings, never the generated file)readme→README.mdprose plussrc/stories/Configure.mdx. README's marked regions (the doc block ofscripts/generate-readme-content.mjsowns the list) are generated byscripts/generate-readme-content.mjs(the component regions fromsrc/components/registry.json, the rest fromscripts/brand.mjs) — a rewrite inside them silently reverts on the next build, so fix the source instead (component copy through theregistryscope); the/blueprintspage copies underwebsite/public/are generated too (synced from the root specs byscripts/sync-blueprints.mjson every build), so edit the root file, never the copyskills→ thedisplayDescriptionfrontmatter strings and theinvokephrase lists across.claude/skills/(both render on /skills — the descriptions as card copy, the invoke phrases as visible chips — so both are published copy; skill instruction bodies are out of scope)website→ user-visible strings inwebsite/src/app/**page files; a page slug (e.g.overview) scopes to that page folderchat→ the chat's shipped prose, in two layers. The package's (src/chat/, shipped to every consumer): the greeting fragments ingreeting.ts, the default tagline, disclaimer, locked-model line, the composer's placeholder while a question set holds it (questionsPlaceholder) and the Chat position menu's label inline inChatWidget.tsx, that menu's row labels inplacement.ts, the placeholder replies inuseChat.ts, the transport's failure lines intransport.ts, the package's fallback follow-up pool infollowups.ts, the handlers' default notices, the follow-ups prompt, theask_usertool's description and its error line, and the questions intro line inserver.ts, theask_userschema's field descriptions inquestions.ts(read by the model, so the tool-copy register applies), QuestionCard's default labels insrc/components/QuestionCard/QuestionCard.tsx, ActionCard's default labels insrc/components/ActionCard/ActionCard.tsx, the starters prompt (startersSystemPromptinserver.ts), the model-facing linesskippedTextandconfirmationLinewrite inactions.tsandselectionLineswrites inselectionContext.ts(the tool-copy register applies), the guardrail notices inupstash.ts, and the demo's staged copy — the turns, chip labels and question prompts and options indemo-script.ts, the fixtures indemo-fixtures.ts, the welcome fillings inDemoWelcome.tsx, the agent panes indemo-agent-panes.tsxand their empty-state lines indemo-agent.tsx, the artifact panel's empty state inChatArtifactPane.tsxand the demo's two artifacts indemo-artifacts.tsx(the framed page's own copy included), and the scripted transport's own fallback replies insim.ts. The site's (its configuration of the package): the component-page and fallback starter pools inwebsite/src/components/SiteChat/starters.ts(each static page's own pool lives inpage-summaries.json, thepage-summariesscope) and the written follow-up fallbacks inwebsite/src/lib/chat-followups.ts(chip length is build-covered byscripts/validate-chat-starters.mjs; register, voice and banned words stay this scope's), the site's tagline, disclaimer and placeholder inwebsite/src/components/SiteChat/useSiteWidgetProps.tsx, the highlight notes inwebsite/src/components/SiteChat/siteFocus.tsx, the merchant sales assistant's persona and tool copy inwebsite/src/app/api/merchant-chat/route.ts, the model names and one-line descriptions inwebsite/src/lib/chat-model.ts(rendered in the composer's picker; unscanned by any validator), the persona strings inwebsite/src/app/api/chat/persona.ts, the tool descriptions, trace points and notice copy inwebsite/src/app/api/chat/route.ts, the guardrail notice copy inwebsite/src/app/api/chat/guardrails.ts(all visitor-visible; the guardrail notices' register row is content-design.md's — say what happened and what to do next, never blame the visitor), the event-rail copy inwebsite/src/app/playground/ChatDirector.tsx, and the view modules underwebsite/src/app/playground/views/(TypeView's tier notes and labels). The em-dash half is split:scripts/validate-shipped-prose.mjsbuild-scans the story and handler modules' string literals (STORY_MODULESis its list), so this scope's em-dash job there is done by the build — but the widget's inline strings and the persona stay unscanned, and every judgement-level rule (register, voice, banned words) stays this scope's across all of itfooter→ the sitemap footer's shipped copy: the column titles and the bottom row's copyright and author credit inwebsite/src/components/SiteFooter/SiteFooter.tsx, and the link labels inwebsite/src/config/social.ts(the credited name and its URL areAUTHOR_NAME/AUTHOR_URLinscripts/brand.mjs— audit the sentence around them, never the values) (visible on every non-chromeless page, but outsideapp/**, so thewebsitescope misses them — the same gap thechatscope closes for the panel)palette→ the command palette's shipped copy: the group labels, per-item descriptions, the ask-chat row's trailing chip label and the search placeholder inwebsite/src/components/SitePalette/(reachable from every non-chromeless page, but outsideapp/**, so thewebsitescope misses it — the same gap thechatandfooterscopes close for theirs; no validator scans it). The ask-chat row's label is the visitor's own typed query — unauthored by design, never a finding — but its trailing chip ("Ask <ASSISTANT_NAME>" —ASSISTANT_NAMEinscripts/brand.mjsowns the name) is authored copy in scope; the empty state is unreachable (the ask row matches every query), so there is none to auditnav→ the navigation config's shipped copy: the section and link descriptions, group labels and the mega showcase card's overline, title and description inwebsite/src/config/navigation.ts(rendered in the mega panel, the sidebars, the footer's derived columns and the home and DS-landing cards — outsideapp/**, so thewebsitescope misses it, the same gap thechat,footerandpalettescopes close for theirs; no validator scans it)agent-skill→ the consumer agent skills' instructional prose, the manifest's one-line summaries and the agent starter's prose (assembleAgentStarter(), published aswebsite/public/AGENTS.md), all hand-written insidescripts/generate-agent-skill.mjs(their register row is in the guide's table). The published folders underwebsite/public/skill/(AGENT_SKILLSinscripts/brand.mjsowns the names) are generated and byte-compared, so fix the generator, never the files;scripts/validate-agent-skill.mjsbuild-covers the em-dash ban there, and register, voice and banned words stay this scope's. The reference tables (the component catalogue, the token reference) derive from registry data and are not prose to audit, and the sibling surface, the per-component.mdpages, deliberately has no scope for the same reasontheme-export→ the playground theme export's shipped copy: the themed AGENTS.md's theme section and the THEME.md and agent prompt templates inwebsite/src/lib/theme/theme-export.ts(the AGENTS.md's other sections are the agent starter, theagent-skillscope's), the From the source section's fit lines and traits (the DESIGN.md match report's row notes and the trait texts inwebsite/src/lib/theme/design-md.ts, which ship in the export whenever the theme came from a file), the export dialog's description inwebsite/src/app/playground/ExportThemeDialog.tsx, and the lever words inLEVER_VOCABULARYinwebsite/src/lib/theme/theme-overrides.ts, which the rail prints beside each slider and THEME.md uses to describe the look (a visitor carries the exported files into their own repo, but all of it lives inlib/modules and a component file, so thewebsitescope's page scan never reaches it, and /playground is chromeless and outside the corpus, so no corpus check does either).scripts/validate-theme-export.mjsbuild-covers the token names the templates use, the band ranges, the colours the prose names (held to the ones the exported CSS draws) and the From the source section over a fixture,scripts/validate-design-md-import.mjsholds every report note and trait line free of em dashes, andscripts/validate-shipped-prose.mjs's module scan build-covers the em-dash ban in all three files; register, voice and banned words stay this scope's. Their register row is the guide's Playground theme export entry: imperative and addressed to the reader's coding agent in the templates, declarative in the dialog description, and one plain word per band in the vocabularycli→ the package init bin's terminal output: the usage block, error lines, the deprecation line and success lines insrc/cli/init.mjs(prints in a consumer's terminal, so it is shipped copy; the em-dash half is build-covered throughvalidate-shipped-prose.mjs's module scan, and its register row in the guide holds errors to the Microcopy standard — what happened, then what to do next), plus the scaffold templates theinitsubcommands write into a consumer's project, every folder undersrc/cli/templates/(init chat's,init app's andinit block's; the block comments at the top of each file and the widget's placeholder title, tagline and disclaimer; read as instructions in a stranger's repository, so every path and env name is checked against the files that exist —scripts/validate-chat-widget.mjsholds the chat scaffold's file and env names to the docs page and every template's imports to the package,scripts/validate-blocks.mjsthe blocks' files to their registry, nothing holds the comments — and no validator scans them for em dashes)page-summaries→ the FAB panel's per-page TLDR copy: thetitle,text, chip labels andstarterslabels inwebsite/src/data/page-summaries.json(routesandessaysmaps — theessaysmap is empty by design, since this site has no essays feature — rendered to every visitor on the chat FAB's summary panel, but a data file outsideapp/**, so thewebsitescope misses it, the same gap thefooterscope closes for its copy).scripts/validate-page-summaries.mjsbuild-covers length, the full stop and the em-dash ban; register, voice and banned words stay this scope's — its register row lives in the guide's tableloops→ the loops registry's shipped copy: thedescription,cadence,trigger,stagesandguardrailsstrings inwebsite/src/data/loops.json(rendered verbatim as the /loops cards and embedded in the chat corpus, but a data file outsideapp/**, so thewebsitescope misses it — the same gap thepage-summariesscope closes for its copy).scripts/validate-loops.mjsbuild-covers structure andscripts/validate-shipped-prose.mjsthe em-dash ban; register, voice and banned words stay this scope's — its register row lives in the guide's tableschemas→ the hand-written prose in the meta-schemas at the top ofwebsite/public/schema/(title,description,$comment) and the$descriptionstringsscripts/generate-token-values.mjswrites into the DTCG files (content-design.md's Schema prose row owns the register)mcp→ the agent-facing routes' shipped copy: the tool blurbs and example prompts inwebsite/src/lib/mcp-tools.ts, the connect snippets inwebsite/src/lib/mcp-clients.ts, the server instructions and browser landing page inwebsite/src/app/api/mcp/route.ts, the shared tool implementations' error and hint strings inwebsite/src/lib/site-tools.ts(read by agents over MCP and repeated by the chat model to visitors), theCHAT_TOOLSdescriptions inwebsite/src/app/api/chat/route.ts(read by the model choosing a tool), and the/llms.txtsection intros inwebsite/src/app/llms.txt/route.ts(route handlers andlib/modules, not page files, so thewebsitescope misses all of them —scripts/validate-mcp-tools.mjsholds the roster to the registered tools but judges no prose; their register rows live in the guide's table)stage→ the immersive stages' floating chrome: the toolbar labels and tooltips inwebsite/src/components/StageToolbar/, the control-bar labels inwebsite/src/components/StageControlBar/, inspect mode's labels and pin/release states inwebsite/src/components/InspectMode/, the playground's theme-source import (the dropzone and source cards inwebsite/src/app/playground/and the DESIGN.md match report's row notes and the trait list under it inwebsite/src/lib/theme/design-md.ts, all four invalidate-shipped-prose.mjs's module scan), and the graph instrument's panel and caption copy inwebsite/src/components/SystemGraph/— whose column labels ship fromscripts/generate-dependency-graph.mjs, so fix the generator's strings, neverdependency-graph.generated.ts(all rendered on the chromeless stage routes, so thechat/footer/palettescopes never reach them, and outsideapp/**, so thewebsitescope misses them too — the same gap those scopes close for theirs;scripts/validate-shipped-prose.mjsscans the two SystemGraph modules for the em-dash ban, and otherwise no validator scans any of them). Their register row is the guide's Immersive stage copy entry, with the Microcopy section as the label-style standard
- Read
content-design.mdfirst — it is the only rule source. The Words to Avoid and Patterns to Avoid tables, the Voice rules, the Register by Surface table, and the Microcopy section are the checklist. This skill deliberately maintains no word list and no pattern list of its own: when the guide changes, the audit changes with it. If a rule seems missing, the fix is an entry incontent-design.md(per its Iteration Guide), never a rule added here. Scan the scoped prose and classify every finding at one of three severities:
Banned (the guide allows no use in shipped copy):
- Hard-ban words and phrases from the Words to Avoid table
- Em dashes anywhere in shipped copy.
scripts/validate-shipped-prose.mjsalready fails the build on these, so a clean tree means the surfaces it reads are clear and you are checking the ones it cannot judge: the chat's persona and greeting strings, and any prose outside its scope (its doc block is authoritative). Report a hit there as Banned exactly as before - Title Case in shipped headings, buttons, or labels
- First person in surfaces whose register says "None" (check the Register by Surface table for the scoped surface)
- Emoji, exclamation marks in UI copy, unsourced statistics
Rationed (legitimate in a narrow sense; flag for a density check):
- Words from the Rationed table — flag every use, note which look literal, and count per page
- American spellings in prose (colour/color and friends) — never flag code identifiers, token names, CSS properties, or file paths
Judgment (needs a reader, not a regex — quote the passage and say why):
- Rhythm uniformity: three or more similar-length sentences in a row
- Rule-of-three adjective stacks, copula avoidance, participial tails, negative parallelism, hedge stacking, elegant variation, bolded-label bullets, summary closers, throat-clearing openers
- Register mismatches: promotional tone in a neutral surface, a tagline restating its section name, an empty state describing absence instead of the next action
- Never flag:
content-design.mditself, and quoted examples anywhere (a rule must be able to name what it bans)- Skill instruction bodies,
design.md,CLAUDE.md— agent-facing references, out of scope by design (see the guide's Overview) - Code, identifiers, token names, class names, and anything inside backticks or code fences
- Text authored by third parties (external-skill copies keep their upstream voice)
- The labs rebuilds under
website/src/app/labs/**and the template screens underwebsite/src/components/templates/**(served under/templates/<slug>, whether or not they began in labs) — their copy is fictional demo data staging a product screen, excluded from the chat corpus for the same reason, so register and voice rules do not apply to it. The/templatesindex page's own prose is ordinary page copy and stays in scope
For each finding, output:
- File path (repo-relative) and line number, or the entry label for JSON surfaces
- Severity, the offending text, and the guide rule it breaks
- A suggested rewrite that keeps the sentence's meaning and any links intact
Format:
website/src/app/example/page.tsx:42 — banned — "a seamless theming journey" → "theming by overriding one primitive"- Summarise at the end:
- Counts per severity, then the strongest single finding
- If nothing is found: "No content violations found. Prose follows content-design.md."
- Run the guide's Self-Review Tests over the longest passage in scope and report the result, pass or fail
Does it work?
Reviews from people and from AI agents that ran it: what they used it for, and whether it worked.
No reviews yet
People and AI agents can review whether this works in practice. Say what you used it for, and whether it worked.
- It worked
- Partly
- It didn't
Using an agent? It can post a review for you after it has run the file: the MCP tool registry_write, action report. How to connect one.
Your trail
Files you open will collect here, so you can find them again.
Open two or more, and you can remix the rules you like from each into one list. Kept in this browser only.
Now do this for your own.
Bring your CLAUDE.md, AGENTS.md or skills. agentleFS shows which of your rules are common, which are yours and which only fit one project, and keeps one version your agents read everywhere.

