skills/unslop/SKILL.md

154 lines
7.3 KiB
Markdown

---
name: unslop
description: Cut AI tells from anything written in my projects. Apply to all prose I ship, including code comments, godoc, error strings, log lines, Svelte UI copy, docs, READMEs, and commit messages. Always apply.
---
# Unslop
Edit text so it reads like a person who works on this codebase wrote it. This
covers every writing surface in a Go/Svelte project: godoc and code comments,
error and log messages, UI copy, markdown docs, commit messages, and PR
descriptions.
## Process
1. Scan for the patterns below.
2. Rewrite. Preserve meaning, match the surrounding voice.
3. Self-audit: "What makes this obviously AI generated?" Fix remaining tells.
## Voice
- Have opinions. State what happened and what it means, don't neutrally list.
- Vary rhythm. Short sentences. Then longer ones that take their time.
- Be specific. Not "this can cause issues" but "the client stays disconnected
and the request times out after 2m".
- If a sentence could appear unchanged in another project's docs, it says
nothing about this one. Cut it.
- Match the existing voice. When two docs cover sibling features, they should
read like the same person wrote both: same structure, same phrasing for the
same concepts, same level of detail.
## Go code comments
- Every commented element (func, struct, var) gets a comment whose first
word is the element's name, written as a complete sentence ending in a
period. `// ParseSize converts a human-readable size ("2.5G") to bytes.`
- A comment states a constraint the code can't show, a real-world fact, or
the regression it guards. Never a narration of the next line, where the
code came from, or why the change is correct. That last kind is
review-speak and turns into noise the moment the change merges.
- The exception to the no-narration rule: a function with multiple logical
steps uses short section comments to label each phase. "Validate input.",
"Persist to database.", "Build response." Those segment the function;
they don't narrate individual lines.
- Operational tone, written for someone maintaining or debugging the
system. No conversational language, jokes, or speculative notes.
- Name the external source when there is one: the distro, the tool version,
the kernel behavior. Naming the exact distro quirk the branch exists for
beats "handle legacy services".
- Spell out arithmetic so numbers aren't magic:
`// reallocated 8 -> 40+40 capped 80; total 89 -> REPLACE_SOON.`
- Match the file's comment density. A file with sparse comments doesn't get
a narrated paragraph bolted onto one function.
## Errors and logs
- Error strings: lowercase, no trailing punctuation, no "Error:" prefix.
Chain context with colons or `%w`: `syncing repo: connecting to source:
connection refused`. Say what was being attempted, not "failed to failed
to".
- An error the operator will read should point at the fix when one is known:
"set license.key in the config, or pass --license-key".
- Log messages: terse, lowercase, structured fields for the variables, no
exclamation marks, no emoji. `task executed` with fields beats "Task was
executed successfully!".
- Never log or print chatbot phrases: "Successfully completed!", "Oops!",
"Something went wrong :(".
## Svelte and UI copy
- Sentence case everywhere: buttons, labels, headings, menu items. "Import
test", not "Import Test".
- Error states name what failed and what to do next. Not "Oops! Something
went wrong" but "the server is unreachable; check that the service is
running".
- Empty states say what will appear there or how to add the first item. No
cutesy filler, no illustrations-with-quips tone.
- No exclamation marks in UI text. No emoji in buttons, headings, toasts, or
placeholder text.
- Labels are literal. A field for a slug says "Slug", not "Your unique
identifier". Tooltips explain the consequence of the setting, not restate
its name.
- No marketing adjectives in product UI: "powerful", "seamless", "blazing
fast". The interface should describe, not sell.
## Docs and READMEs
- Say the thing directly. If a sentence can be replaced by a plainer one
that says the same thing, replace it.
- A doc stands alone for its task. Don't make the reader open a second doc
to use the first one; inline the few lines they need.
- Don't restate. If an example already appeared in an earlier section, later
sections reference it, they don't duplicate it.
- Don't explain external systems. A doc about configuring a third-party
integration covers how to configure it here and why, not how the third
party's API works.
- Structure follows the sibling doc. Same heading shapes, same table format,
same key: value conventions, so the docs read as one set.
- README covers how to build and test via the Makefile, actual usage, and
real configuration. No badge walls, no "Features" bullet lists of
adjectives, no roadmap promises.
- Headings in sentence case. No decorative emoji. No bold on every proper
noun.
## Commits and PRs
- Imperative, plain, specific: "Switch unit tests to testify", "Replace
polling with retry backoff". No "This PR introduces...", no "Enhanced",
no scope theater.
- The body states what changed and why, names the bug or behavior pinned,
and stops. No summary tables of the diff, no "Testing" section that just
says tests pass.
## Language tells
- AI vocabulary: additionally, crucial, delve, enhance, fostering, garner,
intricate, landscape (abstract), pivotal, robust, seamless, showcase,
streamline, tapestry, testament, underscore, utilize, leverage. Use the
plain word.
- Fancy ways to say "is": "serves as", "stands as", "boasts", "features".
Say "is" or "has".
- "Not just X, but Y." State the point directly.
- Rule of three. Don't force ideas into groups of three; use the natural
number.
- Filler: "in order to" becomes "to", "due to the fact that" becomes
"because", "it is important to note that" gets deleted.
- Hedging stacks: "could potentially possibly" becomes "may".
- Abstract metaphor nouns: substrate, wedge, vector, nexus, primitive (as
noun), harness (as metaphor), surface (as in "API surface"), scaffolding
(as metaphor), paradigm, north star, flywheel. Pick the concrete word.
- Say what it does, not how it feels. "SQL you can read" names a feeling;
"`.toSQL()` returns the exact string sent to the database" names a
mechanism. If a sentence can't be restated as a fact, instruction, or
number, cut it.
- Active voice. "The compiler validates queries", not "queries are
validated". Passive only when the actor is unknown or doesn't matter.
## Punctuation and style tells
- No em dashes, anywhere. Use periods or commas. Don't swap in parentheses
or en dashes as a substitute; end the sentence instead.
- Colons before a list or example only, not as mid-sentence connectors.
- No arrow chains in prose ("A → B → fails"). Write the sentence. Arrows
are fine inside code and code comments where they're the local idiom.
- Straight quotes, not curly.
- Bold sparingly. A bold lead-in that names an item and ends in a period is
fine; a bold label with a colon that restates the line is a tell.
- No decorative emoji in headings, bullets, commits, or code.
## Chat artifacts
Never let these into committed text: "I hope this helps!", "Let me know
if...", "Great question!", "You're absolutely right!", "Found the smoking
gun!", cutoff disclaimers like "while specific details are limited". Respond
directly, write directly.