Writing standards for the drafting layer¶
Status: reference. Written 2026-08-03.
Written for anyone drafting with this pipeline, and for the skills that draft on their behalf. Assumed: GENRE.md for which skill does what. Not covered here: the prose standard this repository's own documentation is held to, which is HOUSE-STYLE.md.
Shared prose standards for every skill in .claude/skills/. Each SKILL.md
points here rather than restating them, and adds only the rules specific to
its own genre.
These are drawn from the technical-communication literature -- primarily the
Diátaxis framework, Google's
Technical Writing courses, and
Suzan Last's Technical Writing Essentials (BCcampus). What follows is the
part that transfers across all five genres. Diátaxis's genre-specific rules
do not all transfer -- "one path, no options, minimal explanation" is
correct for tutorial-writer and actively wrong for survey-writer, where
weighing alternatives is the deliverable. Take the audience discipline and
the sentence-level craft from these sources; take the structural rules only
from your own SKILL.md.
1. Decide the audience before drafting¶
Source: Google, Technical Writing One ("Just enough writing" / audience analysis); Last, TWE §7.7 "Do a careful audience and task analysis".
Write down -- in working notes, not necessarily in the document -- who the reader is and what they already know. Every downstream decision depends on it: what can go unexplained, which background needs a recap, how much notation is safe, how much hedging is appropriate.
A named reader beats a category. "A second-year undergraduate who has taken one programming course" is usable; "students" is not. "A thesis examiner in this subfield" is usable; "an academic audience" is not.
2. The curse of knowledge is the default failure¶
Source: Google, Technical Writing One, which names the curse of knowledge as the central hazard for engineer-writers. The term itself is Camerer, Loewenstein and Weber (1989), popularised by Steven Pinker.
You know the material and the reader does not. The specific danger is the step that feels too obvious to state -- which is exactly the step you will omit and the reader will fail on.
Concrete guards:
- Define each term once, at first use, then use it consistently. Never two names for one concept, never one name for two concepts.
- Expand an acronym at first use, then use the acronym. Don't reintroduce the expansion later, and don't drift back to the long form.
- Treat "obviously", "simply", "just", "of course", "clearly", "easy" as defect markers. When the thing isn't obvious, the reader concludes the failure is theirs. Delete the word; if the sentence then looks like it's asserting too much, that's the actual problem showing through.
3. State scope up front¶
Source: Last, TWE §7.7, whose introduction checklist asks for the scope -- "what will and will not be covered" -- and the reader's assumed background.
Say what the document covers, what it deliberately does not, and what the reader is assumed to know already. A reader who can't tell whether they're equipped for a document will either bounce off it or waste an hour finding out they were missing background.
4. Sentence-level craft¶
Source: Google, Technical Writing One (short sentences, active voice, consistent terms, defining terms once); Last, TWE §2.2 "Communicating with Precision" and §7.7 "Writing Style" on the passive-voice failure.
- Short sentences, one idea each. If a sentence must be reread to parse, split it.
- Active voice with a named actor: "the scheduler discards the packet", not "the packet is discarded".
- Prefer a concrete instance over an abstract statement of the general case, then generalize from it. Readers build general rules from instances, not the reverse.
- Lead each paragraph with its point. A reader skimming only first sentences should still get the argument.
- Cut hedging that carries no information. "It may be argued that X is possibly a factor" says less than "X is a factor", and the difference is not caution -- it's noise. Real uncertainty gets stated, once, precisely.
5. Don't let a document do two jobs¶
Source: Procida, Diátaxis -- the four-quadrant model and its claim that each kind of documentation "needs to be written in a different way".
This is Diátaxis's actual portable insight. A document that tries to be both a survey and a tutorial is worse at each than either would be alone, because the two have opposite obligations: a survey must present alternatives and weigh them, a tutorial must eliminate every choice.
If, while drafting, you find yourself writing material that belongs to a different genre, stop and say so to the user rather than absorbing it. The routing tables in each SKILL.md's "When to invoke" section exist for exactly this moment.
6. Read it once as the reader¶
Source: Last, TWE §7.7, which names as a requirement of effective instructions the "willingness to test your instructions on the kind of person you wrote them for".
Before presenting anything, reread the draft as the reader defined in §1 -- not as yourself. Flag every point where a term arrives undefined, a step skips reasoning, notation changes meaning mid-document, or a claim assumes something never established.
This pass catches more real problems than any other single step. The technical-communication literature's stronger form of it is a usability test with a real member of the audience. That is not available inside a drafting run, so this reread is the substitute. Make it a genuine second pass, not a skim of what you just wrote.
7. Say what you don't know¶
Every genre here shares one rule from AGENTS.md's citekey invariant: a gap stated plainly is always better than a gap papered over. Thin corpus coverage, an unresolved contradiction, a step you couldn't verify -- all of these get reported to the user in prose. None of them get smoothed.
8. Dialect and house style¶
A draft is written in one dialect of English, and which one is a fact
about the reader rather than a habit of the writer. A thesis submitted at
an Indian university is en-IN or en-GB; an IEEE submission is en-US; a
European funder's deliverable is usually en-GB. Settle it in §1, with the
reader, and record it as the language: line in the dossier's scope.md
-- a BCP-47 tag, so en-GB, not "British".
Recording it is the point. A preference stated in chat is gone by the
next session, and the model's own default takes over the first revision
made weeks later, silently. draft-reviser reads scope.md before any
edit, so a tag on disk reaches every future revision with no further
instruction and no restating.
One dialect per draft, and it governs the draft's own prose. Quoted material keeps its source's spelling, and so do a cited title, a proper noun, and a dataset or code identifier: changing those is a misquotation, not a correction.
House style is the same field's second half. A target venue may impose conventions these standards do not settle: serial comma or not, "Section 3" or "§3", how a figure is captioned. Record the decision beside the dialect, rather than re-deciding it section by section.
A caveat this section owns. §2's defect-marker list is English literals, and §4's voice rules are an Anglophone technical-writing convention. A draft in another language needs them adapted rather than transliterated, and nothing in this document should be read as claiming they carry over unchanged.
9. What is checked mechanically, and what is not¶
Some rules above have a decidable answer and some do not. The split matters in both directions, and getting it wrong fails in opposite ways. Mechanising §4's "short sentences" builds a machine that splits sentences past the point the argument survives. Leaving §2's literals to memory means they are checked only when someone remembers to.
| Rule | Section | Decidable? | May a machine act on it unattended? |
|---|---|---|---|
Dialect matches scope.md's language: |
§8 | yes | yes |
| No defect markers: "obviously", "simply", "of course", "clearly", "easy" | §2 | yes | yes |
| "just", specifically | §2 | no | no -- the adverb ("just add the flag") and the adjective ("a just outcome") are not separable by string match, so it is reported for a human eye |
| Each term defined once, then used consistently | §2 | yes, given the dossier's glossary | yes |
| Acronym expanded at first use, then not re-expanded | §2 | yes -- first occurrence is computable | yes |
| A glossary's acronym expansion still matches the current acronym vocabulary | §2 | yes, given the dossier's glossary and [style].acronyms -- but only the glossary is compared, not the draft's own prose |
yes |
| Active voice with a named actor | §4 | detectable | no -- the fix is a judgement |
| Each paragraph leads with its point | §4 | heuristic only | no -- surfaced, never applied |
| Hedging that carries no information | §4 | detectable | no -- the fix is a judgement |
| Short sentences, one idea each | §4 | no: this is a score | no |
| The reread as the reader | §6 | no | never |
Nothing in the last column is a continuous score, deliberately. A readability index is the tempting exception, and the instructive one. A loop minimising grade level splits sentences past the point the argument survives, and replaces precise technical vocabulary with shorter, vaguer words -- because a polysyllabic term is indistinguishable to the metric from bad writing.
It may be reported. It may never be optimised. HOUSE-STYLE.md has that argument in full.
Quoted spans are exempt from every row, and this is the one place that
needs saying. Drafts produced by this pipeline contain source text by
construction, so "simply" inside a quoted abstract and an -ize inside a
cited title are correct rather than findings. No rule here has a
zero-exception form, which is also why none of them may become a gate --
see ARCHITECTURE.md's "Layer 4" for the axis that
decides which checks may block, and SOUL.md for why there is
exactly one that does.
Every verdict in the table is scoped to English, for the reason §8 gives.
10. Figures¶
A draft may include a figure only if it is wholly original. A figure extracted from a source paper carries that paper's own copyright, and citing the paper grants no right to reproduce it -- inserting one into a draft, or closely redrawing one from memory, is the same violation in different pixels. Reading a source figure for understanding is fine; the boundary is what ends up in the draft.
A figure's ASCII form is a diagram in a code block -- box characters,
arrows and labels built from + - | / \ > < ^ v, 7-bit characters only.
Keep it to about 70 columns so it survives the rendered PDF's monospace
block without wrapping.
A code block, not specifically a fenced one. In a Markdown draft you
write a fence and the md render keeps it. Where the renderer inlines
the ASCII form into a .tex-sourced .md preview, pandoc emits a
4-space indented block instead -- verified, and it is the shape to
expect rather than a defect: every line is shifted by the same four
spaces, so the diagram's alignment is intact and ^ \ < > come through
literally.
Unicode box-drawing (┌─┐│└─┘) is excluded, not merely discouraged:
this pipeline renders PDF with pdflatex, which does not have those
glyphs set up and fails the whole render with Unicode character ┌
(U+250C) not set up for use with LaTeX -- verified against this
project's own render_output.py call, not a general pandoc claim. A
diagram that renders one figure and breaks every other one downstream
in the same draft is worse than no diagram.
Every figure has two forms¶
ASCII is what a Markdown reader should see; it is not what a thesis wants. So a figure in this pipeline exists twice -- once as a TikZ picture, which sets as vector art at the consuming document's own font and line width, and once as the plain-ASCII diagram above.
Both forms are always sibling files, in every genre, and a draft
carries only a marker naming them -- with one exception, and it is not
about figures. thesis-chapter-writer's .tex fragment is what the user
\inputs directly into their own real thesis, never touched by this
pipeline again once it leaves content/drafts/; a marker-only TikZ would
render fine through this pipeline's own renderer and then silently vanish
the moment the user does the one thing that genre exists for. So that
genre's TikZ stays inline, via the \input a real thesis resolves for
itself; its ASCII, like every other form in every other genre, is a file
named by a marker.
1 2 3 4 5 6 7 | |
A topic directory is mandatory for a draft that carries a figure. A
flat content/drafts/<slug>.md puts its figures in
content/drafts/figures/, shared with every other flat draft, where two
drafts that each name a figure fig1 silently overwrite each other in
content/rendered/. Each genre skill settles the draft's path at the
start of its process, before a figure is on anyone's mind; deciding on a
figure later is a reason to move the draft and its dossier, not a reason
to mkdir beside a flat one.
Every draft names both forms with a marker comment -- thesis-chapter-writer
additionally keeps its TikZ inline, for the reason above, but still marks
its ASCII the same way everyone else marks both. The marker is what lets
a reader of the draft see that a form exists off the page, and what lets
a reviser find every figure by grep rather than by parsing the draft.
One marker, one vocabulary, in both genres: figure:, naming the
figure's base name without a suffix. The renderer derives <base>.tex
and <base>.txt from it. The two spellings below differ only because a
comment in Markdown and a comment in LaTeX are written differently --
the thing you write, and the rule you remember, is the same either way,
and no draft ever names one figure twice.
Markdown drafts -- tutorial-writer, textbook-chapter-writer,
survey-writer -- carry the marker alone, with no fence beside it:
1 | |
For --format tex and --format pdf the renderer replaces that marker
with \input{figures/<name>.tex}. For every other format, including the
Markdown draft's own --format md, it replaces the marker with the
.txt contents in a fence -- there is no inline diagram left to fall
back on, so this substitution runs even when the output format matches
the draft's own language.
The .tex draft -- thesis-chapter-writer, this pipeline's one
LaTeX-sourced genre -- keeps its TikZ inline, via the \input a real
thesis resolves for itself, with the ASCII marker following it:
1 2 | |
For --format md the renderer substitutes the .txt contents for that
\input, in a temp copy. Writing a verbatim block by hand is not the
author's job here: the fragment on disk stays exactly what the user
\inputs into their own thesis, and the ASCII appears only in the
preview that needs it.
The marker must be a comment, never a second \input. A literal
\input{figures/<name>.txt} makes pdflatex read the ASCII art as LaTeX
source, and the alphabet above is full of math-mode-only characters:
1 | |
That failure lands in the user's own thesis build, where we never see it -- our own render substitutes the line away first. A LaTeX comment is inert to pdflatex, dropped by pandoc, and meaningful only to this pipeline.
What the pair requires¶
- Both forms, or no figure. A figure is not finished until both sibling files exist and the marker is in the draft. A pair with a missing half renders in one format and disappears in the other, and a draft that refers in prose to a figure the reader cannot see is worse than one with no figure at all.
- Originality binds the TikZ identically. A TikZ picture redrawn from a source paper's figure is the same violation in different pixels, and that a vector redraw is easier to produce than a traced bitmap changes nothing about whose figure it is. Reading a source figure for understanding is fine; the boundary is the same one as above.
- No citekeys inside a figure file.
python -m src.draft gatereads the draft and does not follow\input, so a citekey in a node label or a caption insidefigures/<name>.texis invisible to the one check standing between this pipeline and a fabricated reference. Cite in the draft's prose, where the gate can see it. This is stated and not gated, deliberately:docs/CODE-STANDARDS.mdkeepssrc.draft gateas the project's only gate, meaning exactly one thing -- a fabricated citekey fails -- and giving it a second meaning would blunt the first. - Verify the TikZ compiles before keeping it. A figure that does not
compile fails the whole pdf render, not just the figure. Probe
kpsewhich tikz.styfirst; if it is absent, write only the ASCII form and no marker, and say so in chat. Do this at drafting time: a marker written on a host withouttikz.stymakes every latertex/pdfrender of that draft fail with[missing-binary], because the renderer refuses rather than silently falling back -- the same draft has to produce the same output on every host. If it is present, wrap the figure in a minimal\documentclass{article}+\usepackage{tikz}document, runpdflatexon it, and never keep one that fails. - Plain 7-bit ASCII in the ASCII form, wherever it lives, same alphabet and same reasoning as the Unicode exclusion above. It is what every non-LaTeX render emits, and a draft with no TikZ figure at all still renders its fence straight into the pdf -- which is exactly the run where one Unicode box character takes the whole document down with it.
Where tikz.sty is absent, the fallback is the same in every genre and
is what this section required before the pair existed: the ASCII goes
inline, in whatever form the draft's own language carries natively -- a
fenced code block in a Markdown draft, a verbatim environment in a
.tex fragment -- with no marker and no figures/ files at all. Both
forms survive every format such a host can produce: a fence renders
straight through Markdown's own formats and, via pandoc, into tex/pdf
too; a verbatim block survives pandoc's LaTeX reader into both
--format pdf and --format md -- verified through this pipeline's
actual render path both ways.
This is not gated mechanically -- there is no equivalent of
citation_gate for a figure's originality. Whether a diagram is
genuinely original, and whether a source figure's own licence would
even permit reproducing it, stays a judgement call. Nor is there one for
agreement between the two forms: nothing can check that a TikZ picture
and an ASCII diagram depict the same thing, so a revision that edits one
and not the other leaves the pdf and the Markdown preview disagreeing,
silently and indefinitely. draft-reviser carries the only defence
there is -- touch a figure, touch both forms.
Sources and attribution¶
Three openly licensed works supply the principles above. All three require attribution under their licences; this section is that attribution.
-
Daniele Procida, Diátaxis: A systematic approach to technical documentation authoring. https://diataxis.fr/ — source repository https://github.com/evildmp/diataxis-documentation-framework. Licensed CC-BY-SA 4.0. Supplies: the four-quadrant genre model (tutorial / how-to / reference / explanation); the definition of a tutorial as a lesson in which the instructor is responsible for the learner's success; the driving-lesson analogy; the diagnosis of explanation-overload in tutorials; the narrative-of-expectations technique.
tutorial-writeris built on this source more than any other. -
Suzan Last, Technical Writing Essentials, University of Victoria / BCcampus, 2019. https://pressbooks.bccampus.ca/technicalwriting/ — §7.7 "Writing Instructions" is the chapter drawn on most. Licensed CC-BY 4.0. That chapter is itself adapted from David McMurrey's Online Technical Writing (https://mcmassociates.io/textbook/, CC-BY 4.0), which is therefore credited transitively. Supplies: audience and task analysis as a preliminary step; scope and assumed-background statements in the introduction; equipment and supplies lists; the placement and function of note/warning/caution notices; command-verb phrasing and the argument against passive voice in instructions; testing instructions on a real member of the audience.
-
Google, Technical Writing Courses for Engineers. https://developers.google.com/tech-writing. Licensed CC-BY 4.0. Supplies: the curse of knowledge as the defining failure mode; defining each term once and using it consistently; expanding an acronym at first use and then not reverting; short sentences with one idea each; active voice with a named actor; leading a paragraph with its point.
What is original here¶
The prose in this file and in every .claude/skills/*/SKILL.md is written
from scratch. A verbatim n-gram check against all three sources above
(107,272 words of source; the algorithm is src/review/verbatim_check.py's
cmd_overlap) reports 0% overlap at an 8-word threshold, and nothing
above five consecutive shared words anywhere. What is borrowed is the
ideas, credited above; what is added is their translation into
operational rules for this pipeline's five genres, the decision about which
principles transfer across genres and which do not (§5's warning), and the
handling of failure modes specific to multi-agent drafting.