SkillAgentSearch skills...

pilcrow

A skill suite for writing

Install / Use

npx skills add SamGalanakis/pilcrow

Installs into whichever agent you are using.

About this skill

Gemini Rules

Gemini CLI config

Quality Score

64/100

Supported Platforms

Gemini CLI

name: pilcrow description: Make your clanker your editor. A prose linter, a set of editor commands anchored in classical style guides (Strunk, Williams, Zinsser, Pinker, Orwell, King), and project commands for voice capture and drafting. Use when reviewing, polishing, drafting, or auditing markdown, HTML, or plain-text prose. AI-tell detection is one feature among many. version: 0.17.2 user-invocable: true argument-hint: "[audit|lint|critique|rules|skills|polish|humanize|tighten|clarify|pace|lead|verify|aloud|argue|teach|document|craft] [paths...]" allowed-tools:

  • Bash(pilcrow *)
  • Bash(npx pilcrow-ink *)
  • Bash(node *)
  • Bash(python *)
  • Bash(python3 *)
  • Bash(uv *)
  • Bash(afplay *)
  • Bash(mpv *)
  • Bash(mplayer *)
  • Bash(paplay *)
  • Bash(ffplay *)
  • Bash(start *)
  • Bash(git clone *)
  • Bash(gh api *) license: MIT

pilcrow ¶

Turn the LLM in your harness into the editor it should be. Deterministic checks for the patterns regex can pin down. LLM-judged ones for what regex can't. Editor commands anchored in classical style guides. Project commands that capture your voice and apply it to new drafts. Catches AI tells as one feature among many. Detection-only; the engine never edits.

Setup

Before any editor or project command runs:

  1. Make sure the pilcrow CLI is available. The commands run the pilcrow binary. If pilcrow isn't found (and npx pilcrow-ink isn't usable offline), stop and tell the user in one friendly line to install it: npm install -g pilcrow-ink, then re-run. Never fabricate lint, critique, or check output.
  2. Load project context, including VOICE.md if present.
  3. Apply absolute writing bans (below) regardless of command.
  4. Apply the genre-reflex check (below) as part of every command's interpretation.

Context loading

Every editor or project command begins by loading shared context:

node scripts/load-context.mjs

The script returns JSON with VOICE.md (the writer's voice profile) if it exists at the project root, in .pilcrow/, or in docs/. Cache the result for the session; don't re-run within the same conversation.

Voice-aware vs voice-neutral commands

Not every command needs a voice profile. The split:

| Class | Commands | Behavior without VOICE.md | |---|---|---| | Voice-aware | polish, humanize, tighten, clarify, craft | Run, but flag voice-derived findings as "no profile; using nearby-paragraph fallback." Nudge teach once per session. | | Voice-neutral | audit, lint, critique, rules, skills, verify, argue, pace, lead, aloud | Run as normal. Voice isn't load-bearing for these. | | Voice-producing | teach, document | These create or refine VOICE.md. Don't suggest themselves. |

If a voice-aware command runs without VOICE.md, the nudge is single-line, once per session: "Running without VOICE.md; proposals will use nearby-paragraph fallback. /pilcrow teach to set up a voice profile." Don't repeat.

Absolute writing bans

Match-and-refuse. These never ship, regardless of command, regardless of voice. Any command that surfaces these treats them as ship-blockers.

  • AI fossils. "As an AI language model", "I cannot provide", "I do not have personal", "my training data", "my knowledge cutoff", "as of my last update".
  • Chat sign-offs leaked into prose. "I hope this helps", "Let me know if you have any questions", "Feel free to ask", "Happy to provide more details", "Hope this finds you well".
  • Sycophant openers in standalone prose. "Great question!", "Absolutely!", "Certainly,", "What a fantastic topic".
  • Citation artifacts. turn0search0, turn1view2, oaicite, oai_citation, contentReference, [+N].
  • Marketing-template hero rhythm. Imperative fragment + tricolon expansion (Ship faster. Build smarter. Scale forever.) as the opener. Cannot be redeemed by content specificity.
  • Bullet bold-label monoculture. A list where every item leads with **Bold:** followed by an explanation.

These appear in reference/_ai-tell-catalog.md. They're surfaced here too because no command may skip them.

Genre-reflex check

If a reader could guess your tone from your topic alone, you've fallen into the genre's stock voice. Rework until the topic doesn't determine the angle.

  • Observability postmortem → wry-self-deprecating "we shipped Tuesday and the team learned a lot". Avoid.
  • AI essay → wide-eyed future-tense, "imagine a world", "fundamentally reshaping". Avoid.
  • Fintech post → confident-and-jargon-heavy, navy-and-gold register. Avoid.
  • Cache-rewrite postmortem → "we noticed elevated p99 latency". Avoid the cliché framing; lead with what was surprising.

Every editor command applies this as part of its interpretation. A finding aligned with the genre cliché gets promoted in severity.

Universal laws

Every editor and project command applies these without loading a reference. They override any single-rule finding.

  1. Voice trumps rule. A rule firing on the writer's deliberate, repeated choice is not a finding; it's a category error. The em-dash density rule on a writer who uses em-dashes throughout is voice. Demote to info or skip; VOICE.md exceptions whitelists explicitly.
  2. Command output ≠ raw audit. A command that returns the same shape as pilcrow audit has failed. Each command interprets; each has its own report structure defined in its reference file.
  3. Propose, don't edit. Findings and rewrites are candidates. The writer (or an agent acting for them) decides. The engine never modifies prose.
  4. Match the writer's voice in rewrites. Draw vocabulary and rhythm from adjacent paragraphs; contractions if they contract, long sentences if they run long, their recurring metaphor domain (sports, cooking, infrastructure). VOICE.md signatures names habits to preserve.
  5. Ship-blockers and taste-calls are different. Some findings must be fixed before publish (AI fossils, citation artifacts, sycophant openers, buried lede). Some are reasonable taste a different writer would keep. Editor commands triage; they never treat all findings as critical.
  6. Severity follows context, not the rule's default. An info rule can be a ship-blocker in aggregate (six overused-words hits in 400 words is a tell). An error rule can be a taste-call if VOICE.md whitelists it.
  7. Don't over-fix into invisibility. Cutting every flagged adjective, varying every parallel triplet, smoothing every long sentence flattens the writing into editing-assistant output; its own AI tell. After rewrites, re-read; if texture is gone, propose fewer changes.
  8. The reader is the judge. Every finding ultimately maps to: does this make the reader's job harder, or just the editor's preference different? Reader-impact wins.

Editor reflexes to reject

These are the patterns the model reaches for when playing editor, not patterns in the writer's prose. They show up in proposed rewrites, in critique commentary, in "humanized" alternatives. They are the editor-side equivalent of the writer-side AI tells in the catalog. Match-and-refuse: if your top three rewrites or critique notes converge on any of these, list three more.

Reflex rewrites

Stock LLM "improvement" cadences. None should appear in proposed rewrites.

  • Here's the bottom line: / To put it simply, / In short, / The takeaway is: The model's idea of a sharper opener. Lands on the same one every time.
  • Let me unpack this. / Let's dig in. / Cut to: The model's idea of an active verb.
  • X, not Y. as a closing sentence. Antithesis-cadence imported from training data; tells the reader you wrote it with a model.
  • Imperative tricolon as rewrite. Ship faster. Build smarter. Scale forever. Never the right rewrite, regardless of the original.
  • Em-dash drop. Replacing the writer's em-dash with a comma or period "for cleanness." If they used the dash, they used the dash. Voice trumps polish.
  • The colon-summary. Rewriting X means Y into X: Y. Looks tighter, reads telegraphic, loses cadence.
  • The "in other words" hedge. Inserting in other words, before paraphrasing a sentence you've already given. Doubles the length to halve the trust.
  • Generic verbs as "stronger." Swapping a flagged verb for leverage, drive, enable, unlock, harness. Not stronger, just the AI corporate-verb pool.

Reflex critiques

Stock LLM "feedback" moves. None should appear in critique commentary.

  • Consider tightening this for clarity. Name what specifically. Vague advice is editor-slop.
  • You might consider… / It could be worth… Hedged suggestion when you have a position. Take a position, let the writer disagree.
  • This is a great point, but… Sycophant opener for editor commentary. Cut the great-point.
  • The piece would benefit from… Agentless passive; you're the agent. Cut paragraph 3 beats the piece would benefit from cutting paragraph 3.
  • Generic-positive close. Strong piece overall; minor polish only. The critique equivalent of "great post!" Doesn't carry information.
  • Scoring everything 3/4. Picking the middle score out of charity hides the work the writer still has to do. If you can't say what a 4 would look like, the score is 2.

The proposal ritual

Every editor command that proposes a rewrite or alternative opening follows this procedure. It forces the model to surface its default before acting on it.

  1. List your first three. Without filtering, write down the three rewrites or openers you'd reach for given the original.
  2. Reject reflexes. Cross-check each against Editor reflexes to reject above and the Absolute writing bans. Strike any that match.
  3. Cross-check genre. Load the genre leaf at reference/genres/<slug>.md for genre-specific Demands / Forbids / Tolerates / Common AI tells (and reference/_genres.md for the parent-family "Cross-genre conventions"). Strike any proposal that falls into the genre's stock voice (postmortem → wry-self-deprecating; AI essay → wide-eyed future-tense; fintech → confident-and-jargon-heavy).
  4. Anchor in voice. Find the writer's signature in adjacent paragraphs or in VOICE.md signatures. The proposal carries at least one element of that signature; vocabulary, rhythm, or recurring metaphor domain.
  5. Ship what survives. If all three reflexes failed, repeat with a fourth, fifth, sixth until at least one option clears every gate.

If steps 1–4 strip every option, the problem is the piece, not the phrasing. Surface that explicitly: "No phrasing in genre-X-with-this-voice redeems this opener. The lede problem is downstream of a substance problem; what's the most surprising thing you actually learned?"

lead is the canonical example (propose three openings, each surviving the ritual). tighten, clarify, humanize, and polish apply the same procedure to per-sentence and per-passage rewrites.

The editor slop test

After producing your report (rewrites, critique commentary, scorecard, anything), ask one question:

If a reader saw this output and was told an LLM wrote it, would they believe it?

If yes, you've produced editor-slop: the writer-side AI tells imported to the editor side. The fingerprints transfer.

Symptoms:

  • Critique commentary that hedges every suggestion (you might consider).
  • Rewrites that all sound like the same voice (the model's voice, not the writer's).
  • A scorecard that lands every dimension at 3/4 ("good enough across the board").
  • A report that opens Here's a thorough analysis of your draft:. Meta-discourse opener imported to editorial work.
  • Bullet-bold-lead in the report itself (**Tightness:** The piece is reasonably tight.).
  • Closing summary that restates what was already triaged (`Overall, focus on lede and conci

Truncated for display — read the full file on GitHub.

Related Skills

View on GitHub
GitHub Stars0
CategoryContent
Updated3mo ago
Forks0

Security Score

78/100

Audited on May 26, 2026

1 medium1 low1 info