Unnarrate
Companion to unslop. Unslop fixes how AI prose sounds; this deletes text
that should not exist at all: meta-commentary — writing that narrates the
artifact to its own audience. A progress bar already announces progress;
"progress is shown while it runs" beside it is a second, redundant signifier.
Agents produce this constantly because they narrate their chain of thought
into every surface they touch.
The deletion test
Delete any sentence, label, or comment whose only content is:
- a description of the artifact it lives in ("This section describes..."),
- something the reader can already see (a tooltip restating the label, a
comment restating the next line), or
- the process that produced it (
// As requested, extracted into a helper).
Two checks decide close calls:
- Delete it mentally. If the reader loses nothing, it was a no-op — text
that appears to do something but changes nothing.
- Portability. If the line could appear unchanged in another project,
another PR, or above different code, it says nothing about this one. Cut it.
What to cut, by surface
UI copy
- Copy describing behavior the interface already performs: "Progress is shown
while installing", "A spinner appears while loading", "The list updates
automatically". The widget is the signifier; don't add a verbal one.
- "Loading..." text beside a visible spinner; "File uploaded successfully" →
"File uploaded".
- Tooltips and help text restating the label: field "City of birth", tip
"Enter the city of your birth".
- Positional narration: "Click the button below to submit", "Select an option
from the dropdown".
- Onboarding/coach-mark copy that inventories every control instead of
pointing at the one non-obvious action.
- Accessibility duplicates:
aria-label="Submit button" on a <button>,
alt="Image of a chart" (screen readers already announce the role).
Docs and READMEs
- "This document describes...", "In this guide, we will...", "Welcome to the
documentation for X". Start with the content.
- Overview sections that only announce the sections that follow; trailing "In
summary" paragraphs restating the page.
- Docstrings restating the signature (
get_user(id) — "Gets the user by
id"); <summary>Gets or sets the X</summary>. PEP 257 bans exactly this.
- "The following example shows how to..." above an example; prose restating
the adjacent code block.
- Feature bullets and section intros that would be true of any project.
Code comments
- Restating the next line:
// Import React, // Return the value,
// Loop over items.
- Section banners:
// ===== HELPERS =====, // --- Step 3: Validate ---.
- Plan and phase narration:
// Phase 2: refactor, // Using the newly created Foo model.
- Changelog narration:
// Changed from useState to useReducer, // Removed the old handler. Git history holds this.
- Comments addressed to the reviewer instead of the future reader:
// Note: I kept this behavior intact.
Commits and PRs
- Bullet lists restating the diff file-by-file; "This PR adds..." followed by
the title verbatim.
- Template sections filled with restatement; "Test plan: ran the tests" with
no specifics.
- Effort narration: "Comprehensive refactor", "Carefully preserved backward
compatibility". State facts a reviewer can check instead.
Keep — not everything that narrates is a no-op
- Live narration is a signifier; static narration is the tell. An agent
streaming "Installing dependencies…" as it works is real feedback. Copy
describing that feedback exists is the anti-pattern.
- "Why" comments stay: rationale, invariants, warnings about non-obvious
behavior, links to issues and incidents. The rule deletes restatement, not
comments — match the surrounding code's comment density.
- Instructions carrying information the surface can't show stay: formats
("YYYY-MM-DD"), constraints ("8+ characters"), side effects ("this emails
the team"), irreversibility warnings.
- Real alt text stays. Delete the "Image of..." prefix, keep the
description of what the image shows.
- TODOs with a tracking link stay; bare
// TODO: improve this goes.
Applying it
- Sweep the changed surfaces for the patterns above. Delete, don't rewrite —
most hits need no replacement.
- When deletion leaves a real gap, fix the artifact (clearer label,
self-explanatory control), not the narration.
- Then run unslop on what survives.
reference/terminology.md names the phenomenon per community (metadiscourse,
happy talk, obvious comments, no-ops) with sources, for citing or extending
the checklist.
1---2name: unnarrate3description: Remove self-narrating meta-commentary — text that describes the artifact it lives in, restates what the reader already sees, or narrates the process that produced it — from UI copy, docs, code comments, commit messages, and PR descriptions. Apply whenever writing or reviewing those surfaces, and before unslop when editing prose. Triggers: tooltips restating labels, "This section describes...", comments restating the next line, "progress is shown while it runs", PR bullets restating the diff.4---56# Unnarrate78Companion to `unslop`. Unslop fixes how AI prose sounds; this deletes text9that should not exist at all: **meta-commentary** — writing that narrates the10artifact to its own audience. A progress bar already announces progress;11"progress is shown while it runs" beside it is a second, redundant signifier.12Agents produce this constantly because they narrate their chain of thought13into every surface they touch.1415## The deletion test1617Delete any sentence, label, or comment whose only content is:18191. a description of the artifact it lives in ("This section describes..."),202. something the reader can already see (a tooltip restating the label, a21 comment restating the next line), or223. the process that produced it (`// As requested, extracted into a helper`).2324Two checks decide close calls:2526- **Delete it mentally.** If the reader loses nothing, it was a no-op — text27 that appears to do something but changes nothing.28- **Portability.** If the line could appear unchanged in another project,29 another PR, or above different code, it says nothing about this one. Cut it.3031## What to cut, by surface3233### UI copy3435- Copy describing behavior the interface already performs: "Progress is shown36 while installing", "A spinner appears while loading", "The list updates37 automatically". The widget is the signifier; don't add a verbal one.38- "Loading..." text beside a visible spinner; "File uploaded successfully" →39 "File uploaded".40- Tooltips and help text restating the label: field "City of birth", tip41 "Enter the city of your birth".42- Positional narration: "Click the button below to submit", "Select an option43 from the dropdown".44- Onboarding/coach-mark copy that inventories every control instead of45 pointing at the one non-obvious action.46- Accessibility duplicates: `aria-label="Submit button"` on a `<button>`,47 `alt="Image of a chart"` (screen readers already announce the role).4849### Docs and READMEs5051- "This document describes...", "In this guide, we will...", "Welcome to the52 documentation for X". Start with the content.53- Overview sections that only announce the sections that follow; trailing "In54 summary" paragraphs restating the page.55- Docstrings restating the signature (`get_user(id)` — "Gets the user by56 id"); `<summary>Gets or sets the X</summary>`. PEP 257 bans exactly this.57- "The following example shows how to..." above an example; prose restating58 the adjacent code block.59- Feature bullets and section intros that would be true of any project.6061### Code comments6263- Restating the next line: `// Import React`, `// Return the value`,64 `// Loop over items`.65- Section banners: `// ===== HELPERS =====`, `// --- Step 3: Validate ---`.66- Plan and phase narration: `// Phase 2: refactor`, `// Using the newly67 created Foo model`.68- Changelog narration: `// Changed from useState to useReducer`, `// Removed69 the old handler`. Git history holds this.70- Comments addressed to the reviewer instead of the future reader:71 `// Note: I kept this behavior intact`.7273### Commits and PRs7475- Bullet lists restating the diff file-by-file; "This PR adds..." followed by76 the title verbatim.77- Template sections filled with restatement; "Test plan: ran the tests" with78 no specifics.79- Effort narration: "Comprehensive refactor", "Carefully preserved backward80 compatibility". State facts a reviewer can check instead.8182## Keep — not everything that narrates is a no-op8384- **Live narration is a signifier; static narration is the tell.** An agent85 streaming "Installing dependencies…" as it works is real feedback. Copy86 *describing* that feedback exists is the anti-pattern.87- **"Why" comments stay:** rationale, invariants, warnings about non-obvious88 behavior, links to issues and incidents. The rule deletes restatement, not89 comments — match the surrounding code's comment density.90- **Instructions carrying information the surface can't show stay:** formats91 ("YYYY-MM-DD"), constraints ("8+ characters"), side effects ("this emails92 the team"), irreversibility warnings.93- **Real alt text stays.** Delete the "Image of..." prefix, keep the94 description of what the image shows.95- **TODOs with a tracking link stay;** bare `// TODO: improve this` goes.9697## Applying it98991. Sweep the changed surfaces for the patterns above. Delete, don't rewrite —100 most hits need no replacement.1012. When deletion leaves a real gap, fix the artifact (clearer label,102 self-explanatory control), not the narration.1033. Then run unslop on what survives.104105`reference/terminology.md` names the phenomenon per community (metadiscourse,106happy talk, obvious comments, no-ops) with sources, for citing or extending107the checklist.