cmdcolin/claudish

Claude Code skills, starting with a checklist of AI writing tropes in technical prose

Shell

0

45 commits

updated Oct 4, 2026

See the code

See what people are saying

SourceMessageScoreDate

What have you used to help improve AI generated scientific/technical writing/papers (r/ClaudeAI)

I am trying to write up some basic results as a scientific paper, but trying to get claude to help write is very hard. I'm just constantly battling bad flow/bad intro sentences/bad paragraph transitions, bad section headings, weird focusing on minute details instead of engaging points, writing…

1

Oct 4, 2026

README

claudish

Skills for Claude Code.

SkillUse it for
anti-ai-writing-tropesWriting and reviewing docs, comments, captions, CLAUDE.md files and chat answers. A checklist of the habits that make prose read as generated, each with a rewrite.

anti-ai-writing-tropes

The skill is a checklist for technical writing: docs, READMEs, code comments, figure captions, commit messages, PR descriptions and agent instruction files. Each entry pairs a habit with a rewrite that keeps the same facts. A reader often arrives at a paragraph from a search hit, so each paragraph has to make sense alone: name the subject, state the fact, and leave nothing to carry over from the previous paragraph.

Contrastive framing

A sentence that defines a thing by what it is not answers an objection nobody raised. Delete the negative half unless it steers the reader away from a choice they would otherwise make.

PatternBeforeAfter
X, not YEach cache entry is stamped with an expiry time, not compared against the source.Each cache entry is stamped with an expiry time.
A negation, then the claimIt's not a cache. It's a log.It is a log.
Doesn't just X, it YThe CLI doesn't just fetch the page, it caches it.The CLI fetches the page and caches it.
Rather thanCI runs the install command from the README, so it is tested rather than remembered.CI runs the install command from the README, so the command is tested.
A limiting "only"The exporter names only the primary sample and labels every other sample unknown#N.The exporter labels each sample other than the primary one unknown#N.
A bare negativeA record from a shard does not store its sample name. The sample table adds the names.Sample names come from the sample table.

Stance and agency

A value, a file or a figure cannot know, say or earn anything. Name the component or person that acts, or use a verb of description such as lists, marks, contains or shows. Keep the passive where the actor is unknown, because an invented actor is a new claim.

PatternBeforeAfter
A value given knowledgeThe lockfile knows which versions to install.The lockfile lists the versions to install.
An inanimate subject given ownershipeach tab renders its own settingseach tab renders the settings stored for that tab
An artifact given a willeach bar rises to the height its frequency earnseach bar's height is proportional to its frequency
A figure of speechThe config file is load-bearing.Every command reads the config file.
The passive voice hiding the actorThe field is left unset.The parser leaves the field unset.
A value given perceptionthe cache sees the first requestthe cache stores the first request

Sentence shapes

These shapes sound like a conclusion and state none, or split one sentence across punctuation so the reader has to rejoin it. Write the subject and its plain verb, and join facts that depend on each other.

PatternBeforeAfter
The cleftRounding is what shrinks the file.Rounding shrinks the file.
The significance announcementThe key insight is that the index is sorted, which lets lookups use binary search.The index is sorted, so lookups can use binary search.
A colon lead-inEach cache invalidates where a stale read costs most: the session cache invalidates on logout.The session cache invalidates on logout.
A comma-hung appositiveVersion 1 opens one file, a design that cannot compare two.Version 1 opens one file, so it cannot compare two.
A rule-of-three listA file in, a filter applied, a PNG out.The command reads the file, applies the filter and writes a PNG.
A staccato runThe key includes the path. A rename changes the key. The cache misses.The key includes the path, so a rename changes the key and misses the cache.
A fronted "So that" clauseSo that the page loads faster, we added an index.To make the page load faster, we added an index.
A compressed noun phraseThe flush writes the dirty half of each page.The flush writes the half of each page that has unsaved changes.

Openings and closings

A paragraph opens on its subject by name, even when the paragraph before named it, and a section ends at its last fact. Aphorisms and outcome-only sentences leave out the mechanism the reader came for.

PatternBeforeAfter
A pronoun opening a paragraphIt runs the same engine as the app.The renderer runs the same engine as the app.
"The same X" across a headingThe same track feeds the graph view.The coverage track also feeds the graph view.
A count standing in for its nounsClick Share, or save the session to a file. (video) Both hold the same JSON.The JSON from the Share dialog and the saved session file contain the same session.
An aphorism closing a sectionThe rate limit counts retries. A retry is still a request.The rate limit counts retries as requests.
A conclusion standing in for the mechanismA marker that does not parse stops the build.The generator exits with an error on a marker it cannot parse, so the build fails.
Silently, quietly, invisiblyThe second bug silently writes the wrong value.The second bug writes the wrong value and raises no error.

Paragraph transitions

A paragraph that introduces a redesign states the limitation as a limitation in one sentence and the response in the next. A sentence about where the field has moved, with no citation behind it, adds nothing.

PatternBeforeAfter
A description where a limitation belongsVersion 1 opens one file at a time. Version 2 opens several, in tabs.Version 1 is limited to one open file at a time. Version 2 removes that limit by opening several files in tabs.
A problem sized to the solutionVersion 1 cannot show a diff between two files. Version 2 opens files in tabs and shows diffs.Version 1 is limited to one open file at a time. Version 2 opens files in tabs, so it shows diffs.
A narrative bridgeBuild tools have since moved toward incremental compilation. Our build recompiled every file on each change. We added a dependency graph, so it now recompiles only the files a change affects.Our build recompiled every file on each change. We added a dependency graph, so it now recompiles only the files a change affects.
The old tool as the subjectA viewer that reads a log file downloads the whole file to show any line range. We created a chunked format, which make-chunks generates from a log file.To limit the data transferred to the line range in view, we created a chunked format, which make-chunks generates from a log file.

Headings and labels

A heading names its subject in sentence case, and a flag table gives each flag a plain label.

PatternBeforeAfter
A teaser headingThe one setting nobody else hasOffline mode
A phrase where a noun would doWhere the file goesOutput
A heading that says what a thing is notWhat it does not doLimitations
A heading that gives its subject agencyWhat a database answersContents and limitations
Cute naming in a reference table--seed=<n> | the dice--seed=<n> | random seed

Comments and history

A code comment states what the code does now. History belongs in the commit message and rationale in a design doc.

PatternBeforeAfter
Bug history in a commentreset() used to leave the Cancel button showingreset() also hides the Cancel button
An essay where a clause would doWe considered leaving the keys in fetch order, but the diff output has to be stable across runs and fetch order is not, so we sort them first.Sort the keys so the diff output is stable across runs.
ALL-CAPS emphasisthe ONLY differencethe only difference

Register

Generated text favors a small set of words and moves: stacked verbs such as "leverage" and "ensure", participle clauses that draw a conclusion nobody is making, invented labels, and a pitch that sells the thing without describing it. Use the plain verb, one term per thing, and a measurement behind any superlative.

PatternBeforeAfter
The verb clusterThe tool leverages a comprehensive set of heuristics to ensure correctness.The tool uses a set of heuristics to check correctness.
Present-participle synthesisScores drop after the tokenizer change because the tagger was trained on the old token boundaries, highlighting how the two stages interact.Scores drop after the tokenizer change because the tagger was trained on the old token boundaries.
A goal with no quantityTo optimize the rendering of alignments, we created an indexed format.To limit the data transferred when drawing alignments to the region in view, we created an indexed format.
A sentence adverbUltimately, the index is the bottleneck.The index is the bottleneck.
Small ticsThe cache serves as the source of truth.The cache is the source of truth.
A code-internal verbThe loader hydrates each record from the cache or the database.The loader fills in each record from the cache or the database.
The pitch registerThe library is the most modern JSON toolkit, and it does more than parse: it validates against a schema.The library parses JSON and validates it against a schema.

The skill also lists what a fix must preserve, and ships scan.sh, which greps a file or directory for the markers and labels each hit by section.

The skill borrows from the tropes.fyi directory, the Writing Whip and Wikipedia's Signs of AI writing. It differs in three ways: it deletes contrastive framing by default, it pairs every pattern with a rewrite, and it adds sections for technical prose.

Install

As a plugin:

/plugin marketplace add cmdcolin/claudish
/plugin install claudish@claudish

Or copy a skill into your personal skills directory:

git clone https://github.com/cmdcolin/claudish
cp -r claudish/skills/anti-ai-writing-tropes ~/.claude/skills/

Claude loads a skill when its description matches the task, or when you ask for it by name, e.g. "review README.md with the anti-ai-writing-tropes skill".

References

  • tropes.fyi and its directory by Ossama Chaib: the self-answered question, "serves as", suspense transitions, false ranges, invented concept labels, restating closers, bold-first bullets, dead metaphors, narrated deliberation, self-echo, grandiose stakes and Title Case Headings.
  • The Writing Whip, also by Ossama Chaib: synonym cycling, announcers and counts, the claim after its evidence, documentation as a changelog, appended corrections, borrowed authority and comma-clipped tails.
  • Prompting Claude Fable 5.1 (Anthropic): the figure-of-speech test, density, and the warning against dropping all formatting.
  • Prompting Claude Opus 5 (Anthropic): padding, outcome-first reports, reporting every finding before triage, and positive examples over prohibitions.
  • Wikipedia: Signs of AI writing: promotional vocabulary, vague attribution and present-participle synthesis.
  • The writing guides in videoskillet and react-msaview, where most of the technical-prose patterns first appeared.

cmdcolin/claudish

Claude Code skills, starting with a checklist of AI writing tropes in technical prose

Shell

0

45 commits

updated Oct 4, 2026

See the code

See what people are saying

SourceMessageScoreDate

What have you used to help improve AI generated scientific/technical writing/papers (r/ClaudeAI)

I am trying to write up some basic results as a scientific paper, but trying to get claude to help write is very hard. I'm just constantly battling bad flow/bad intro sentences/bad paragraph transitions, bad section headings, weird focusing on minute details instead of engaging points, writing…

1

Oct 4, 2026

README

claudish

Skills for Claude Code.

SkillUse it for
anti-ai-writing-tropesWriting and reviewing docs, comments, captions, CLAUDE.md files and chat answers. A checklist of the habits that make prose read as generated, each with a rewrite.

anti-ai-writing-tropes

The skill is a checklist for technical writing: docs, READMEs, code comments, figure captions, commit messages, PR descriptions and agent instruction files. Each entry pairs a habit with a rewrite that keeps the same facts. A reader often arrives at a paragraph from a search hit, so each paragraph has to make sense alone: name the subject, state the fact, and leave nothing to carry over from the previous paragraph.

Contrastive framing

A sentence that defines a thing by what it is not answers an objection nobody raised. Delete the negative half unless it steers the reader away from a choice they would otherwise make.

PatternBeforeAfter
X, not YEach cache entry is stamped with an expiry time, not compared against the source.Each cache entry is stamped with an expiry time.
A negation, then the claimIt's not a cache. It's a log.It is a log.
Doesn't just X, it YThe CLI doesn't just fetch the page, it caches it.The CLI fetches the page and caches it.
Rather thanCI runs the install command from the README, so it is tested rather than remembered.CI runs the install command from the README, so the command is tested.
A limiting "only"The exporter names only the primary sample and labels every other sample unknown#N.The exporter labels each sample other than the primary one unknown#N.
A bare negativeA record from a shard does not store its sample name. The sample table adds the names.Sample names come from the sample table.

Stance and agency

A value, a file or a figure cannot know, say or earn anything. Name the component or person that acts, or use a verb of description such as lists, marks, contains or shows. Keep the passive where the actor is unknown, because an invented actor is a new claim.

PatternBeforeAfter
A value given knowledgeThe lockfile knows which versions to install.The lockfile lists the versions to install.
An inanimate subject given ownershipeach tab renders its own settingseach tab renders the settings stored for that tab
An artifact given a willeach bar rises to the height its frequency earnseach bar's height is proportional to its frequency
A figure of speechThe config file is load-bearing.Every command reads the config file.
The passive voice hiding the actorThe field is left unset.The parser leaves the field unset.
A value given perceptionthe cache sees the first requestthe cache stores the first request

Sentence shapes

These shapes sound like a conclusion and state none, or split one sentence across punctuation so the reader has to rejoin it. Write the subject and its plain verb, and join facts that depend on each other.

PatternBeforeAfter
The cleftRounding is what shrinks the file.Rounding shrinks the file.
The significance announcementThe key insight is that the index is sorted, which lets lookups use binary search.The index is sorted, so lookups can use binary search.
A colon lead-inEach cache invalidates where a stale read costs most: the session cache invalidates on logout.The session cache invalidates on logout.
A comma-hung appositiveVersion 1 opens one file, a design that cannot compare two.Version 1 opens one file, so it cannot compare two.
A rule-of-three listA file in, a filter applied, a PNG out.The command reads the file, applies the filter and writes a PNG.
A staccato runThe key includes the path. A rename changes the key. The cache misses.The key includes the path, so a rename changes the key and misses the cache.
A fronted "So that" clauseSo that the page loads faster, we added an index.To make the page load faster, we added an index.
A compressed noun phraseThe flush writes the dirty half of each page.The flush writes the half of each page that has unsaved changes.

Openings and closings

A paragraph opens on its subject by name, even when the paragraph before named it, and a section ends at its last fact. Aphorisms and outcome-only sentences leave out the mechanism the reader came for.

PatternBeforeAfter
A pronoun opening a paragraphIt runs the same engine as the app.The renderer runs the same engine as the app.
"The same X" across a headingThe same track feeds the graph view.The coverage track also feeds the graph view.
A count standing in for its nounsClick Share, or save the session to a file. (video) Both hold the same JSON.The JSON from the Share dialog and the saved session file contain the same session.
An aphorism closing a sectionThe rate limit counts retries. A retry is still a request.The rate limit counts retries as requests.
A conclusion standing in for the mechanismA marker that does not parse stops the build.The generator exits with an error on a marker it cannot parse, so the build fails.
Silently, quietly, invisiblyThe second bug silently writes the wrong value.The second bug writes the wrong value and raises no error.

Paragraph transitions

A paragraph that introduces a redesign states the limitation as a limitation in one sentence and the response in the next. A sentence about where the field has moved, with no citation behind it, adds nothing.

PatternBeforeAfter
A description where a limitation belongsVersion 1 opens one file at a time. Version 2 opens several, in tabs.Version 1 is limited to one open file at a time. Version 2 removes that limit by opening several files in tabs.
A problem sized to the solutionVersion 1 cannot show a diff between two files. Version 2 opens files in tabs and shows diffs.Version 1 is limited to one open file at a time. Version 2 opens files in tabs, so it shows diffs.
A narrative bridgeBuild tools have since moved toward incremental compilation. Our build recompiled every file on each change. We added a dependency graph, so it now recompiles only the files a change affects.Our build recompiled every file on each change. We added a dependency graph, so it now recompiles only the files a change affects.
The old tool as the subjectA viewer that reads a log file downloads the whole file to show any line range. We created a chunked format, which make-chunks generates from a log file.To limit the data transferred to the line range in view, we created a chunked format, which make-chunks generates from a log file.

Headings and labels

A heading names its subject in sentence case, and a flag table gives each flag a plain label.

PatternBeforeAfter
A teaser headingThe one setting nobody else hasOffline mode
A phrase where a noun would doWhere the file goesOutput
A heading that says what a thing is notWhat it does not doLimitations
A heading that gives its subject agencyWhat a database answersContents and limitations
Cute naming in a reference table--seed=<n> | the dice--seed=<n> | random seed

Comments and history

A code comment states what the code does now. History belongs in the commit message and rationale in a design doc.

PatternBeforeAfter
Bug history in a commentreset() used to leave the Cancel button showingreset() also hides the Cancel button
An essay where a clause would doWe considered leaving the keys in fetch order, but the diff output has to be stable across runs and fetch order is not, so we sort them first.Sort the keys so the diff output is stable across runs.
ALL-CAPS emphasisthe ONLY differencethe only difference

Register

Generated text favors a small set of words and moves: stacked verbs such as "leverage" and "ensure", participle clauses that draw a conclusion nobody is making, invented labels, and a pitch that sells the thing without describing it. Use the plain verb, one term per thing, and a measurement behind any superlative.

PatternBeforeAfter
The verb clusterThe tool leverages a comprehensive set of heuristics to ensure correctness.The tool uses a set of heuristics to check correctness.
Present-participle synthesisScores drop after the tokenizer change because the tagger was trained on the old token boundaries, highlighting how the two stages interact.Scores drop after the tokenizer change because the tagger was trained on the old token boundaries.
A goal with no quantityTo optimize the rendering of alignments, we created an indexed format.To limit the data transferred when drawing alignments to the region in view, we created an indexed format.
A sentence adverbUltimately, the index is the bottleneck.The index is the bottleneck.
Small ticsThe cache serves as the source of truth.The cache is the source of truth.
A code-internal verbThe loader hydrates each record from the cache or the database.The loader fills in each record from the cache or the database.
The pitch registerThe library is the most modern JSON toolkit, and it does more than parse: it validates against a schema.The library parses JSON and validates it against a schema.

The skill also lists what a fix must preserve, and ships scan.sh, which greps a file or directory for the markers and labels each hit by section.

The skill borrows from the tropes.fyi directory, the Writing Whip and Wikipedia's Signs of AI writing. It differs in three ways: it deletes contrastive framing by default, it pairs every pattern with a rewrite, and it adds sections for technical prose.

Install

As a plugin:

/plugin marketplace add cmdcolin/claudish
/plugin install claudish@claudish

Or copy a skill into your personal skills directory:

git clone https://github.com/cmdcolin/claudish
cp -r claudish/skills/anti-ai-writing-tropes ~/.claude/skills/

Claude loads a skill when its description matches the task, or when you ask for it by name, e.g. "review README.md with the anti-ai-writing-tropes skill".

References

  • tropes.fyi and its directory by Ossama Chaib: the self-answered question, "serves as", suspense transitions, false ranges, invented concept labels, restating closers, bold-first bullets, dead metaphors, narrated deliberation, self-echo, grandiose stakes and Title Case Headings.
  • The Writing Whip, also by Ossama Chaib: synonym cycling, announcers and counts, the claim after its evidence, documentation as a changelog, appended corrections, borrowed authority and comma-clipped tails.
  • Prompting Claude Fable 5.1 (Anthropic): the figure-of-speech test, density, and the warning against dropping all formatting.
  • Prompting Claude Opus 5 (Anthropic): padding, outcome-first reports, reporting every finding before triage, and positive examples over prohibitions.
  • Wikipedia: Signs of AI writing: promotional vocabulary, vague attribution and present-participle synthesis.
  • The writing guides in videoskillet and react-msaview, where most of the technical-prose patterns first appeared.

Languages

Shell

100.0%