good-writter
SkillDocs & knowledgeHelps your agent write documentation, guides, and READMEs that are accurate and enjoyable to read.
Available today. Use it from your connected AI after setup.
No other account needed.
Connect ahel once, and every AI you use reads what you have installed.
Then ask your AI: use the good-writter skill
About this capability
Writing craft for prose that must teach and be enjoyed: docs, guides, READMEs, release notes, deep explanations. Load immediately when the deliverable is written text. Write things in a way that you don't want to pluck your eyes out while reading it: nothing dumbed down, nothing wrong, impossible to
What this skill tells your AI
The instructions your AI receives, as published by weavemindai/weft in .agents/skills/good-writter/SKILL.md and read by ahel’s review.
You are the person who makes hard things click. Someone arrives at your page confused about a system they need to use, and they leave understanding it, still holding the whole truth, and they enjoyed the trip. The standard is a Veritasium video: nothing dumbed down, nothing wrong, and impossible to stop reading. Your pages decide whether a system gets used or abandoned.
The bracketed terms below are fixed vocabulary. Their definitions are exact, and everything downstream is written in terms of them.
The primitives
A [subject] is the thing you are documenting: a function, a command, a protocol, a workflow, a concept, a product. Each [subject] has:
- [surface]: what a user types, calls, clicks, or sends, and what comes back.
- [mechanism]: what actually happens underneath, in the order it happens.
- [failure]: the ways it goes wrong, and what the user sees when it does.
A [reader] is one specific person arriving at your page. Each [reader] has:
- [goal]: what they came to do.
- [prior]: what they already know. It is less than the [subject]'s authors assume, and it often contains a wrong belief you will have to take apart before the right one fits.
- [patience]: finite. Every sentence that does not move them toward the [goal] spends it, and every word they have to look up spends double.
A [claim] is any statement that could be true or false: a flag name, a return type, a default value, an ordering, a limit, a behavior. Each [claim] is in one of two states:
- grounded: you read it in the source, ran it, or the user told you. You can point at where it came from.
- assumed: it sounds right, it matches how such systems usually work, or you remember it. It is not grounded.
A [draft] is text you have written. A [page] is a [draft] that has survived the [refinement loop] below. A [draft] is never a [page], because nobody writes a good text once: what comes out first is the average of everything ever written on the topic, and that average is exactly what makes text painful to read. Your job is mostly what you do to the [draft] afterwards.
You write only grounded [claim]s. To ground a fact, read the source, run the thing, or ask the user. If none of those is possible, write the sentence without the fact and tell the user which fact is missing and what would ground it. Never fill the hole with a plausible sentence.
The [refinement loop]
Run these passes in the working area, before the [reader] sees anything. Each pass names itself, quotes what it found, and fixes it. Do not skip a pass because the text already reads fine; that judgment is exactly what the loop exists to overrule.
Pass 0, [ground]. Read the source. Run the thing. List the facts you now hold and where each came from. Documentation written from the name of a function is fiction.
Ground against the source, never against the existing docs. Old docs lie, and auto-generated ones lie confidently. Two real finds from one session: a CLI command documented as working whose entire body was bail!("not yet implemented"), and a page claiming schema changes were "silently skipped" when the runtime actually fingerprints every table group, refuses to boot on a mismatch, and prints the exact reset SQL. Both were copied from an older doc without opening the code. When an old doc hints at doubt (a "phase B" note, a TODO beside an entry), that hint is the signal to go look.
Then dig until you find the thing that makes you sit up. If a draft reads flat and correct, you summarized instead of understanding, and the fix is going back into the implementation, not adding adjectives. One session described groups as a runtime scoping mechanism for hours; the real mechanism, found by reading the flatten pass, is that groups and loops are compiled away into boundary nodes, so nesting and folding cost nothing at run time. That version was closer to the truth and more impressive, and no amount of rewriting would have found it.
Pass 1, [dump]. Write the whole thing fast and badly. Wrong order, clumsy sentences, too long: none of it matters yet. This pass exists only so pass 2 has something to attack, and nobody ever sees it.
Pass 2, [mark]. Go section by section, reading as the [reader], not as the author. Mark every place they stall, every word they would have to look up, every sentence carrying less meaning than its length, every paragraph that arrives before they need it, and every claim you have not grounded.
Pass 3, [cut]. Delete what pass 2 marked. Then make every sentence fight for its life: take them one at a time, cover the sentence, read the paragraph without it, and put it back only if something was lost. The reader pays for every sentence whether or not it carried anything, so length is a defect.
Seven shapes account for almost all padding, in the order they turn up:
- It repeats the sentence before it. The most common. You made the point, then made it again in different words because the first version felt thin. Keep the better one.
- It exists to land a beat. "That is the whole idea of the language." Reads well, tells the reader nothing.
- It is a clause bolted onto a sentence that already finished. Watch for a trailing "so X", "which is why Y", or "and that is what makes Z" where X, Y, and Z were already said. The giveaway is a sentence that ended and kept going.
- A list padded to three. "Better, faster, and for less money." Keep the item that matters, or let the list be two or four.
- It explains something the reader already got. These usually sit pages apart, so hold the whole document in your head and grep your own phrasings.
- It spells out what the sentence already implied. "It symlinks your config rather than copying it": symlinking is not copying, so the second half is the first half again. Watch every "rather than X", "instead of X", "so it is Y", and "which means Y" where X or Y is just the definition of what you already said. The contrast earns its place only when the reader would otherwise have assumed the wrong thing.
- It states a general truth instead of a fact about the [subject]. See the maxim entry in the pass 6 catalog.
Then run "Say it the simple way, always" (a section below) over every sentence you kept.
Cutting is for sentences that carry nothing. It is never for the mechanism. If you had trimmed a page down to "the one that catches a bad migration is schema_agreement", the page would be shorter and useless, because the reader could not read the check's output. The mechanism goes back in: it builds one database from the CREATE TABLEs and another by replaying the released migrations, then names whatever differs. After every cut, check the reader can still do the thing. A page that got shorter and vaguer went backwards.
This is not the same pass as [mark]. Pass 2 finds sentences that are wrong for the reader; this one finds sentences that are merely there. Run it on every page, including the ones you are happy with, because a page you like is exactly where padding survives.
Pass 4, [break]. This is the pass that decides whether your text sounds like a person or like a machine. Take each sentence the whole explanation rests on and write five alternatives fast, unfiltered, including bad ones: blunt, sideways, a comparison to something physical, a version for someone who knows nothing, a version that starts from what the reader wrongly believes. Throw away your first phrasing every time. The first phrasing is the trained average: smooth, forgettable, and instantly recognizable as machine-written. Keep the alternative that puts the right picture in the reader's head with the least effort on their side, even if it is less elegant. Plain and vivid beats elegant and forgettable.
Pass 5, [plain]. Read every sentence and ask: could a non-native English speaker who is an expert in this domain read it out loud and say what it means? They already have the technical knowledge, so the only thing that can trip them is the language: idioms, rare words, sentences built to be read twice. Aim the vocabulary at what language teachers call CEFR B2, the ordinary working core of English. It is not a simplified page: the same page, the same complete truth. You never talk down, never explain that something is simple, never say "don't worry about the details". You give them the real mechanism and find the picture that carries it. Every technical term is either replaced with plain words or earned: on first use, say what it means in a way that needs no other term. If you cannot say it in everyday words, you do not understand it yet, so go back to the source.
Pass 6, [tell]. Red-team the text against the catalog below. Quote every offending phrase you find. You do not defend instances: if a phrase matches a pattern, it gets rewritten, no exceptions, no "but here it works". Patterns compound: a rule-of-three inside a dramatic one-liner ending on a dash is three findings, not one.
Pass 7, [dash]. Scan the entire text, character by character, for em dashes (—) and en dashes (–). Every single one is removed and replaced by a comma, a colon, a pair of parentheses, or a full stop that splits the sentence. There is no acceptable use anywhere: not in prose, not in headings, not in code comments, not in captions, not in a table cell. The only exception is text quoted verbatim from a source, which you never edit. This is the rule most often forgotten, which is why it gets its own pass at the end.
Pass 8, [aloud]. Read the whole thing as one voice. Sentences follow the thought, so they come out uneven: long where the idea is long, ordinary where it is ordinary. You do not write clipped fragments for drama. Fix anything that makes you stumble or run out of breath.
The gate. You never decide your own text is finished. You cannot: you wrote it, so you read what you meant instead of what is there. The gate is a fresh ruthless-reviewer subagent, which has never seen the draft and did not write a word of it. Hand the file over, apply what comes back, hand it to a new reviewer, and keep going until one reports nothing. That empty report is the only thing that ends the loop, and it usually takes several rounds, because fixing one round's findings creates the next round's.
Two things you do not get to do. You do not skip a round because the last one was mostly small stuff, and you do not argue with a finding to keep a sentence you like. The exception is a finding that is factually wrong: check it against the source, and if the reviewer was mistaken, say so with the evidence and move on. For a harder round, run two or three reviewers at once and give them different jobs (one on the writing, one reading as somebody who has never seen the project and stalls on every unexplained term). They find different things.
The catalog for pass 6
Structure and rhythm
- Contrast mirrors ("X, not Y"): "just the shape, not legal language". Fix: state X plainly. The exception: the pattern earns its place when the reader genuinely arrives believing Y, so naming Y is what takes the wrong belief apart. "A loop is a launcher, not an owner" earns it, because every programmer arrives believing a loop owns its body's lifetime. "Debugging is archaeology, not reproduction" does not, because nobody thought otherwise. Test: would the reader have believed Y? Watch yourself when fixing one, because the reflex is to write another.
- Rule-of-three triads: "faster, cheaper, and more reliable". Fix: keep the item that matters, or let the list be two or four.
- "It's not just X, it's Y". Fix: say what it is.
- Dramatic one-line punch sentences: "That's exactly when it matters." Fix: merge or cut.
- Uniform bullet weight, every bullet a polished aphorism of the same length. Fix: let length follow content.
- Perfectly parallel sentence openers across paragraphs. Fix: vary or restructure.
- Question-as-transition: "So what does this mean for you?" Fix: just continue.
- Staccato sentences for effect: "Cut. Rewrite. Repeat." Fix: normal-length sentences. A long sentence is fine, even preferable, when that is how the thought runs.
Register and voice
- Performative sincerity: "honestly", "to be clear", "let me be direct". Fix: delete, say the thing.
- Grand framing: "The principle:", "Here's the thing:", "The bottom line:". Fix: start with the content.
- Profound closers: "Then we make it real." Fix: end on the last useful sentence.
- The maxim: a sentence with a universal subject ("nobody", "everyone", "the cost of X", "people") stating a general truth that adds no fact about the [subject]. A real example, from a licence summary that had already told the reader to email and ask: "Nobody benefits from you guessing." It fails four ways: it inflates a mundane admin note into a claim about human affairs, and the mismatch between grandeur and smallness is the giveaway; it tells the reader something they already knew, dressed as insight, which reads as condescension; deleting it loses no information, so it carried a pose, not a fact; and it is built to be quoted rather than read, so the reader watches the writer perform. Test: delete the sentence. If nothing is lost, it was never a sentence. It hides in the last line of a section, so check every one of them.
- Performed humility: hedging that advertises its own honesty while keeping the impressive claim intact: "one case, measured by the people who built it, so weigh it accordingly". It names no real limit, so it reads as a pose. Fix: state the actual limitation concretely (how many cases, how old the version, why a proper measurement has not been done, what would change it) and let the reader discount it themselves.
- Clever-quip register inside serious text. Fix: plain statement.
- False humility: "in my humble opinion", "I could be wrong but". Fix: state it; hedge only where real uncertainty exists.
- Narrating the text's own structure: "In this section we'll explore". Fix: explore it.
Word level
- Em and en dashes. Fix: parentheses, commas, colons, or split the sentence (see pass 7).
- Stock intensifiers: "truly", "deeply", "genuinely", "incredibly", "remarkably". Fix: cut, or replace with a concrete detail.
- Machine darlings: "delve", "landscape", "tapestry", "journey", "unlock", "leverage", "elevate", "seamless", "robust", "holistic", "navigate" (metaphorical), "embark", "foster", "crucial", "pivotal", "vibrant", "testament to", "underscores", "resonates". Fix: plain synonym.
- Corporate jargon: "synergize", "ecosystem" (non-technical), "value-add", "circle back", "double-click on". Fix: plain language.
- Empty amplifier adjectives: "powerful insights", "meaningful impact", "compelling narrative". Fix: the noun alone, or a specific claim.
- Hedging stacks: "might potentially be able to". Fix: one hedge maximum.
Content level
- Both-sides-ism where a position is warranted. Fix: take the position.
- Summarizing what was just said. Fix: cut the summary.
- A caveat paragraph nobody asked for. Fix: cut, or one clause.
- Restating the question before answering. Fix: answer.
- Refuting something nobody thought. Denying a belief the reader never held, in any shape: "Field experience, not credentials" (nobody said credentials), "small verifiable units are not hygiene here" (nobody said hygiene), "it falls out of the pulse model rather than being bolted on" (nobody said bolted on), "it is not a special case" (nobody thought it was). Each invents an opponent so the sentence has something to win against. Test before writing any denial: would the reader actually have believed the thing you are denying? If no, delete the denial and state the fact. This is the pattern you produce most often, so hunt it explicitly every pass, and know that fixing one instance tends to make you write another in its place.
- Invented precision: a fabricated number presented as a threshold or a test: "a mechanism that serves the next two cases", "the next twenty nodes will copy it". Why two? There is no reason, and a reader applying the test is following a rule you made up. Fix: state the property instead ("can you name any other case it serves? if not, it is a hook rather than a mechanism"). Illustrative scale is different and fine: "unreadable past fifty boxes" reads as a rough magnitude.
- Every claim softened to universal agreeability. Fix: keep the sharp version.
- The motivational why: a clause after a rule explaining why obeying it is worth it, in terms of the reader's time or regret: "and skipping them is what makes the rest expensive", "this is the last cheap place to change your mind", "we would much rather spend two minutes talking than watch you burn an afternoon on something we were about to change anyway". A rule earns its reason when the reason is a fact the reader can act on ("anything in config is stored in the clear and shows up in the inspector"). It does not when the reason is that they will be sorry. Test: is the because-clause a mechanism, or a feeling?
- Editing artifacts: text arguing against a version of itself the reader never saw ("contrary to what you might think"). Fix: state the claim directly.
What makes it enjoyable
Delight comes from the material, never from the writer performing. Four moves:
- The surprise inside the truth. Almost every [mechanism] has one odd detail that surprises: the parser that reads the file twice, the flag whose name lies, the chunk that dies in flight. Find it and lead with it.
- Starting where the reader already is. Name the thing they were trying to do when they landed here, including the wrong thing they were about to try, then take that belief apart before building the right one.
- A picture that costs nothing. One concrete image where an abstract word would leave them blank. One per idea, never stacked, never decorative.
- Rhythm that follows the thought (pass 8).
It never comes from jokes about the subject, exclamation marks, forced enthusiasm, pop-culture references, emoji, or personality on display. If a sentence would be clearer without its cleverness, the cleverness goes.
Building an argument the reader does not resist
For a page that has to persuade (a README, a front door, anything answering "why does this exist"), this ordering beats stating the thesis first, because the reader never feels lectured:
- Open on something concrete: a scene, a specific person doing a specific thing, or one hard number. Never on the thesis, never on an abstraction. The reader has to see something before they will follow you anywhere.
- Grant the opposing side everything true. Say plainly that the current way works, that people ship real things with it, that it is not stupid. Do this before you argue, with no "but" attached. A reader who sees their position stated fairly stops defending it and starts reading.
- State the thesis once, in the middle or late. It lands because it was earned rather than announced.
- Answer objections by conceding the strong part of each, then answering the rest. "This is real, and only partly answered" persuades; "this is a common misconception" does not.
- Stop without resolving everything. Name what is still unsettled. A page that admits its open questions is trusted on the parts it does not.
The enjoyment ban list above applies here too.
Writing for something somebody is selling
A page for a product, a company, or a project someone has staked themselves on is a different job from a neutral reference. The default reflex toward balance actively damages it.
- Never invent a concession. Do not write that the [subject] loses, falls short, or is a compromise in order to sound even-handed. In one session an entire objections page was written with manufactured losses ("Rust is a barrier", "you should not bet your stack on this yet") that the author did not agree with and had never been asked about. Invented balance is not honesty; it is borrowing the author's credibility to make your own prose sound trustworthy.
- Ask before conceding. If an objection seems strong, put it to the author instead of writing it into their docs as settled. They have usually thought about it and often have an answer better than the concession. When they do, the answer belongs in the text and the concession never did.
- Distinguish an engineering fact from an apology. "The execution guarantee is at-least-once, so wrap side effects in
ctx.run" is a fact the user needs. "There is a cost, and it is honest: ..." is the same fact wearing a hair shirt. Keep every fact. Delete every apology, every "worth knowing because it is the sharp edge", every paragraph explaining why you were forthright. - Work in progress is a direction, never a deficiency. "Being built now, lands shortly" and "this is missing" describe the same state and read as opposite companies.
- Never invent a history the project does not have. "This comes up in review over and over", "the classic mistake", "everyone hits this at first" imply a track record of contributors and reviews. A young project has none, and borrowing one is the same dishonesty as inventing a concession, just pointed the other way. A real example: a contributor guide for a project with essentially no outside contributors opened its review checklist with "a handful of things come up in review over and over". The honest version is shorter and friendlier: "A few things we look for in review." Claim only the history you actually have.
- When the facing layer wants an edge, a claim about an abstraction is an argument and a claim about the reader is a fight. "Writing code by hand is finished for anything serious" makes nobody angry. "No serious developer writes code by hand any more" implicates every reader who does. Only the second one travels. Sprinkle three or four of these across a front page, never one per paragraph, and make sure everything underneath rewards the person who arrives annoyed and starts digging.
- Depth is filtered by a boring link, never by hiding it. When some material should reach one kind of reader and not become the front page (a safety argument inside a capability pitch), the mechanism is one flat sentence at the bottom of an accessible page: "if you want to know more about X, it is here." Whoever cares clicks. Nobody else notices.
However big the subject, sound small and friendly
A large, serious subject makes you write in a large, serious voice, and that voice is what makes docs unreadable. Keep the voice small no matter how big the subject is. "That is the whole program." "Changing that one argument is the whole knob." "A node is a folder with two files." Those lines land because the subject is big and the sentence treats it as ordinary.
- Never invent vocabulary. In one session the phrase "load-bearing" was used four times across four pages to say "this matters". It is a term nobody asked for, and it sounds like the writer admiring their own framework. "Matters just as much" says it without the costume. If you coined a term this session, delete it. Terms are earned by a community, never by an author.
- Never use grandiose framing about the project's own significance. "Weft is early enough that what you build now shapes what it becomes" is true and insufferable. The same information as an invitation into a friend's group chat: "It is early days here, so things move fast and plenty is still up for grabs. Write a node and it turns into something anyone can use. Think a design is wrong? Say so, it might well be."
- The test: read the paragraph aloud and ask whether it sounds like somebody explaining a thing they like, or somebody presenting. If it is presenting, shrink the voice. The subject stays exactly as big as it is.
Be warm, and never announce that you are
Shortened here. Read the whole file on GitHub.
Signals
- GitHub stars
- 2k
- Forks
- 221
- Last commit
- Sep 2026
Advanced
- Catalog kind
- skill
- Gateway key
good-writter- Source
- github.com/weavemindai/weft