WALL-E STE kernel
This file is the always-loaded kernel: 23 checks plus the machinery. The remaining 47 checks live
in references/. Every check has a stable id, a tier, a detection step, and a fix. Cite the check
id and the citation on every finding. A finding with neither is an opinion.
Precedence
- The house style guide beats this document. Write the conflict down instead of resolving it
silently per document.
- Meaning beats every rule. A fix that changes what the sentence claims is discarded (
1.2,
9.1). drop is not delete is not truncate. stop is not terminate. retry is not
rerun.
- Understood on the first read is the acceptance criterion and the tiebreaker (
9.1). The
reader is a time-poor, competent engineer whose first language is not English, reading once, on
a phone, at 03:00. Clumsy to a native skimmer is the price of unambiguous to everyone else.
Scope
Apply to: READMEs, service and API docs, design docs, ADRs, runbooks, postmortems, migration
guides, release notes, PR and commit descriptions, tickets, review comments, error and log
strings, code comments, dbt and Cube descriptions, Confluence pages, durable Slack (pinned
summaries, handovers, decisions).
Never apply to: code, identifiers, command syntax, quoted text (reproduce byte for byte,
including British spelling), marketing copy and essays (they need a voice), ephemeral chat, and
the glossary and style guide themselves. A formatter owns heading levels, line width, and bullet
characters. A template owns which sections a document must contain. These rules own the sentences.
The standard's ~900-word approved dictionary is deliberately not applied. It cannot carry a README
or an ADR. What survives is its mechanism: one meaning per word, one name per thing, a small
controlled general vocabulary plus an open project glossary.
If the project has a glossary or exception lists (phrasal verbs, -ing nouns), load them in the
mask stage. Without a glossary, terminology findings (E1–E4) are guesses — cap them at minor.
Register dial
Set per block, after classification:
- strict — procedural text, safety blocks, notes inside procedures, error and log strings.
Every applicable check runs.
- flavored — descriptive prose: READMEs, ADR context, PR bodies, model descriptions. Suppress
D3 (add
that), D8 (articles), C21 (repeat the key noun), and C28 (comma readings). Everything
else runs.
Stage 1 — classify each block
Classify per block, not per document. A document that mixes types is normal. A block that mixes
types is the defect (3.6, 5#, 6#).
| Type |
Reader is |
Verb form |
Sentence cap |
| Procedural |
doing |
Imperative, verb first (5.3) |
20 words (5.1) |
| Descriptive |
reading |
Active declarative, no imperative (6#) |
25 words (6.3) |
| Safety (WARNING/CAUTION) |
about to break something |
Imperative or negative imperative (7.2) |
20 words (5.1) |
| Note |
reading context |
Declarative, never imperative (5.5) |
25 words, unlimited sentences |
Tests: procedural means the reader types, clicks, or runs something here. Safety: if they get it
wrong, is the state recoverable by re-running something? No means WARNING. Yes, with a documented
recovery path, means CAUTION. No damage at all means NOTE (7.1).
The caps are alternatives selected by block class. Never report "over 20 words" against a design
doc.
Stage 2 — mask, then lint
Do this once, before any check runs:
- Mask code spans, fenced blocks, and inline SQL.
- Mask quoted strings, UI labels, log lines, URLs, and file paths (
1.14 note, 8.6).
- Mask identifiers:
snake_case, camelCase, kebab-case, dotted paths, ticket keys, SHAs,
image tags, instance types (8.6).
- Mask heading lines before any
-ing check. [EXT] interpretation: 3.5 permits -ing
technical nouns and says nothing about headings.
- Strip list markers and step numbers before any word count (
8.6).
- Load the project glossary and exception lists if they exist.
Every rg command below runs on the masked text. ripgrep's default engine covers everything here
except lookaround (-P, used only by D3).
Limits and counting
| Limit |
Value |
Scope |
Source |
| Procedural or safety sentence |
20 words |
Per sentence |
5.1 |
| Descriptive or note sentence |
25 words |
Per sentence |
6.3, 5.5 |
| Paragraph |
6 sentences |
Descriptive text only. A lead-in plus its list counts as one sentence |
6.6 |
| Prose noun cluster |
3 words |
A hyphenated compound counts as 1 |
2.1, 8.7 |
| Coined term or introduced short form |
3 words |
Never abbreviate a term of 3 words or fewer |
1.9, 2.2 |
| List lead-in and each item |
The cap in force |
Counted separately. Items share no budget |
8.4 |
| Safety block |
2–3 sentences |
[EXT] — the source states no count, its examples do |
— |
One word each: a number (with its unit: 250 ms, 4 TiB), an abbreviation, an identifier or
flag, a quoted span or code span, a name, title, or label (never paraphrase a name to satisfy a
limit), a proper noun, a hyphenated compound, and a whole parenthetical (also checked separately
as its own sentence). Structural numbering is excluded entirely (8.5–8.7).
Worked: Run `kubectl -n prod rollout restart deploy/feature-writer` and wait 90 seconds. is
5 words, not 11.
Tiers
| Marker |
Meaning |
[M] |
Mechanical detection, deterministic fix. Apply it. |
[M+J] |
Mechanical detection, semantic fix. One decision per hit. Never bulk-apply. |
[J] |
Judgement. The entry states the question to ask. |
[EXT] / [GR-n] |
Provenance flags: extension / advisory in the source. Cite them, never as rule ids. |
Severity comes from consequence in context, never from tier or provenance (see Output contract).
Kernel checks
Actors and verbs
A1 · Passive voice [M+J] 3.6
- Catch:
rg -in '\b(is|are|was|were)\s+\w+(ed|en)\b'. Agentful hits (… by X) are highest
precision. On an agentless hit ask: by whom or by what? An answer means a violation.
- Discard:
by naming a dimension or sequence (partitioned by, followed by), participial
adjectives (the failed shard, broken, hidden, frozen — 3.3), and false participles
(open, often, even, seven, token, red, golden).
- Fix: promote the agent to subject. In a step, use the imperative. Or supply
you / we.
- Exception, and it overrides the active-voice rule: never invent a false actor. Passive with
a genuinely unknown agent is correct in descriptive text ("the offsets were corrupted" while
root cause is open). A style rule must never manufacture a causal claim.
A5 · Nominalization [M+J] 3.7, 1.13
- Catch:
rg -in '\b(do|perform|conduct|carry out|make|give|provide|execute)\s+(a|an|the)\s+\w+(tion|ment|ance|ence|sis|al)\b'.
Also bare the ask, a deploy, an ingest, the spend.
- Fix: use the verb directly. "Perform a migration of the table" → "Migrate the table".
Nominalization also hides the actor, so it compounds with A1.
A7 · Verb names no action, object, or direction [M+J] 1.12
- Catch:
rg -in '\b(handles?|process(es)?|manages?|deal with|touch|address|support|update)\b'.
Also any transfer or motion verb with no source and no destination (sync, promote,
migrate, push, restore, cut over): ask what object, from where, to where.
- Fix: name the exact operation, the object, and the endpoints.
update is the worst umbrella
verb: it hides INSERT, UPSERT, MERGE, TRUNCATE, and DROP.
- Exceptions:
update naming the SQL operation, a dependency update, or a security update.
supports with a named version or capability is precise.
Claims
B1 · Modal that hides a fact [M+J] Part 2 2-0-19
- Catch:
rg -n '\b(may|might|could|shall|ought|would)\b' — lowercase only, which keeps the
RFC 2119 exception mechanical.
- Fix:
may → can (possibility) or is permitted to. shall → must. Conditional → state the
condition: "If the lockfile is stale, the build breaks."
- Never convert a modal into a bare categorical claim. "Might break" and "breaks" are different
claims (precedence rule 2).
- Exceptions: uppercase RFC 2119 keywords in a spec. Counterfactual
would comparing a rejected
option in an ADR. Past-ability could ("could not scale past 8 shards").
B3 · Abstract claim, no mechanism and no magnitude [J] 4.1
- Ask: can a reader act on this, or predict the system's behavior from it? An effect with no
mechanism and no magnitude fails. "Improves maintainability" → name what moved where, with
numbers.
B8 · Unverifiable abstraction [M+J] 1.5, [EXT]
- Catch adjectives
[EXT]: rg -in '\b(seamless|robust|powerful|cutting-edge|effortless|world-class|next-generation|revolutionary|blazing|elegant|intuitive|first-class|battle-tested|enterprise-grade)\b'
- Catch verbs:
rg -in '\b(enables?|empowers?|streamlines?|operationali[sz]e[sd]?|fosters?|unblocks?|drives? (adoption|alignment|value)|delivers? value)\b'
- Catch nouns:
rg -in '\b(estate|cadence|fabric|posture|surface area|north star|alignment|learnings|synerg\w+|ways of working)\b'
- Test: point at the command, artifact, config, or measurable change it names. None means
decoration. Fix: delete, or state the measured property.
B9 · Filler word [M] Part 2 2-0-13
- Catch:
rg -in '\b(just|simply|basically|actually|really|very|quite|essentially|of course|obviously|it is important to note that|it should be noted that)\b'
- Fix: delete.
just and simply also smuggle in a claim that the task is easy.
already is [M+J]: keep it only where it names a prior stage or state.
- Owns these adverbs. D14 owns the adjective
actual. just-in-time is a term — the hyphen is
the boundary.
B10 · Reference point not stated [M+J] [EXT]
- Catch:
rg -in '\b(currently|at present|recently|soon|in the near future|as of today|going forward|at this time)\b'
plus bare old, new, stale, legacy, outdated as adjectives.
- Fix: state the version, date, threshold, or condition. Documentation outlives its writing. A
vague relative adjective is a data-loss risk in retention and TTL docs.
- Exception:
now in a log line or a step ("the queue is now empty"). Judge each hit.
B13 · Mixed or missing unit and time convention [M+J] [EXT]
- Catch:
rg -in '\b\d{1,2}\s?(am|pm)\b', bare HH:MM with no zone, GB/GiB mixed in one
document, durations written two ways.
- Fix: ISO 8601 with an explicit zone, one byte-size convention, one duration format, stated once
per project. Nothing else owns this check.
B14 · Rhetorical padding [M+J] [EXT]
- Catch:
rg -in '\b(in summary|in conclusion|to summari[sz]e|overall,|as mentioned above|as previously stated|it is worth noting|that said,|at the end of the day)\b'
and rg -in 'not only .{0,60} but also|is(n.t| not) just .{0,40}(—|--|,) it'
- Fix: delete the closing-summary paragraph — topic sentences already form the outline (C15). A
needed summary goes first, as a
TL;DR. Rewrite reversal constructions as plain statements. A
list of exactly three parallel items where two are enough, or four exist, is padding.
Sentences and structure
C1 · Over-length sentence, and the shape of the split [M+J] 5.1, 6.3, 4.4, 6.2
Absorbs retired C2 (guard rails) and C16 (reconnect).
- Catch: tokenize with the counting convention, compare against the block's cap: 20 procedural
and safety, 25 descriptive and note. One cap per sentence, selected by block class.
- Fix: split at a clause boundary into complete sentences. Then reconnect: mark a causal,
contrastive, or sequential relation explicitly (
then, so, but, as a result). Unmarked
causation is fatal in incident write-ups.
- Guard rails: keep every article, auxiliary, and subject — telegraphic prose is a failed fix.
Never let a word count invent a step boundary: a step is a stopping point.
C8 · Noun pile-up [M+J] 2.1, 2.2, 8.7
- Catch: a run of four or more consecutive nouns and adjectives ending in a head noun. A
hyphenated compound counts as one. Also any token with three or more internal hyphens.
- Fix, in this order:
- Unpack with a preposition, rewriting from the head noun backwards. If no preposition fits,
the relationship is unknown — ask the owner.
- Rewrite a hidden action (
-tion, -ment, -ing) as a verb.
- Hyphenate the sub-groups that genuinely bind.
- For an established name, write it in full once and introduce a short form of 3 words or
fewer.
- When unsure which words bind, method 1 wins. Never guess with punctuation (
2.2).
C9 · Buried conditional [M+J] 5.4, [GR-2]
- Catch:
if, when, unless, after, once appearing after the main verb of a step. Also a
leading condition with no closing comma.
- Fix: condition first, closed with a comma. A skimming on-call reader executes the verb without
the condition.
C15 · Paragraph and section structure [M+J] 6.4–6.6, 9.4
- Catch: more than 6 sentences in a descriptive paragraph (lead-in plus list = one sentence). Six
is a ceiling, not a target.
- Outline test
[J]: extract every heading and the first sentence of every paragraph, in order.
That list must summarize the document. Failures: gaps, repeats, a heading doing the topic
sentence's job, misordered sections. Fix section order before paragraphs.
- Opening sentence
[J]: it must name the thing, say what it is for, and add something the name
does not. X is a service that Xs is padding.
D1 · Unresolvable reference [M+J] [GR-3], [GR-4], 4.4
- Catch:
rg -in '\bthis\s+(is|are|can|will|causes|means|makes|results|happens|breaks|fixes|allows|helps|should)\b',
sentence-initial This/These with no following noun, and any pronoun with more than one
number-matching candidate in reach.
- Fix: write
this <noun>, or restate the cause outright. An ambiguous it in a runbook sends
someone to restart the wrong service.
- Not a violation: a document-scoped
This in an opening or closing sentence.
Words
E1 · Synonym rotation [M+J] 1.11, 6.2
- Catch: more than one member of an alias cluster in one document: {customer, client, account,
user} · {job, task, DAG, pipeline, workflow} · {service, app, component} · {table, dataset,
model, view} · {feature, attribute, field, column} · {deploy, ship, release, roll out} ·
{delete, remove, drop, purge}.
- Fix: one name for one thing, repeated every time. Variation reads as significance and sends
readers hunting for a difference that does not exist.
E5 · Abbreviation failures [M+J] 2.2 M1, 8.3, 6.6
- Catch: all-caps tokens of 2–6 characters with no
Full Term (ABC) expansion earlier in the
same document. Four defects: never expanded · the long form reappears after the definition ·
an abbreviation for a term of 3 words or fewer · abbreviation soup inside a procedure (write
terms out in steps even when defined — this overrides defect 2 there).
- The introduced short form must itself be 3 words or fewer.
- Exempt: terms universal in the field —
SQL, API, HTTP, JSON, CSV, UTC, ETL,
GPU, CI.
E8 · Inflated word [M+J] 1.12, Part 2 recurring errors
- Replace: utilize/leverage→use · commence/initiate→start · facilitate→help ·
ensure/assure→make sure that · prior to→before · subsequent to→after · subsequently→then ·
in order to→to · in the event that→if · a number of→some · regarding/concerning→about ·
obtain/acquire→get · demonstrate→show · transmit→send · additionally/furthermore/moreover→also ·
however/nevertheless→but · therefore/hence/consequently→as a result ·
simultaneously/concurrently→at the same time · portion→part · instantiate→create ·
orchestrate→run, schedule · surface (v)→show · action (v)→do · aforementioned→name the thing.
- Fix: apply the replacement, then reread. A different part of speech means restructure, not
force the swap (
9.1).
- Exceptions:
INSERT, EXECUTE, MATERIALIZE, ROTATE as commands. provision in
infrastructure. terminate is not a synonym for stop: terminating an AWS instance
destroys it. Never rewrite the technical sense.
- Owns
ensure, in order to, surface (v). Do not also report them under D6 or B9.
Procedures
F1 · Step that is not a clean imperative [M+J] 5.3, 3.6
- Catch:
rg -in '^\s*[0-9]+[.)]\s+(The |You must|You should|You need to|You will need to|You have to|It is necessary to|We |.*\b(is|are) to be\b)'
- Fix: start every step with an imperative verb. Delete
you must from steps — a step is already
an order. Reserve must for safety blocks and stated limits: once every step says must, the one
that truly must is invisible.
- A step can open with its condition (C9). F1 rejects a step whose command is not imperative.
F4 · Load-bearing note [M+J] 5.5
- Catch:
NOTE: / [!NOTE] / [!TIP] blocks containing an imperative (including Make sure,
Ensure, Be aware, Remember to) or you must / you need to.
- The delete-the-notes test: strip every note and tip, read the remaining steps, and ask whether a
competent stranger can still finish. Any gap is a step misfiled as commentary. Run it as a
ritual, not a judgement call.
- Fix: rewrite the note as an imperative step, insert it at the right point (usually before the
step it was attached to), re-run the test.
Safety
Attach a safety block to: DROP / TRUNCATE / DELETE with no WHERE · git push --force ·
terraform apply|destroy in prod · kubectl delete ns|pvc · dbt run --full-refresh · an
unbounded backfill or replay · key or credential rotation · a prod schema migration · Kafka topic
deletion · an index rebuild.
G1 · Destructive operation with no warning [M+J] 7#
- Catch: scan for the trigger list. For each hit, check that a safety block sits immediately
before that step.
- Fix: attach one. Danger must be a labeled element, not a tone of voice. The block must pass G2.
G2 · Safety block shape [J] 7.1–7.3 — runs on every safety block, never skipped
- Shape:
<LABEL>: <command or condition>. <consequence>. Three slots, fixed order, none
optional.
- Label first token:
WARNING: (irreversible or externally visible) · CAUTION: (recoverable
with a documented path) · NOTE: (no damage).
- First sentence: an imperative, negative imperative, or condition clause. Never a noun
phrase, never
There is, never a passive.
- Consequence: what happens if the reader ignores it. Omit only if genuinely uncharacterizable,
and then say what is uncertain (
7.3).
- Case is a house choice (
7.1 note). The label word carries the severity, not the formatting.
G3 · Vague warning [M+J] 7.1, 7.3
- Catch:
rg -in 'be careful|take care|use caution|proceed with caution|is critical|is imperative|is essential|at your own risk|may have unintended consequences'
plus softened consequences inside a safety block: rg -in '\b(impacted|affected|inconsistencies|unexpected behaviou?r|issues|problems|degraded experience)\b'
- Fix: name the action and the outcome with blunt words:
deleted, lost, unrecoverable,
outage, leaked, corrupted, overwritten, stale. Softening the harm is what makes a
warning get skimmed.
The catalog
Hard gate: never report a finding for a catalog check without first reading its entry in the
reference file. The entries carry the carve-outs that stop this tool from mangling correct
prose. Kernel checks above are exempt — their carve-outs are co-located here.
| File |
Checks |
Open it when you see |
references/checks-words.md |
E2 E3 E4 E6 E7 E13 A6 D10 |
one action worded three ways, paraphrased asset names, phrasal verbs, slang, capitalized common nouns, verbed nouns, ambiguous modifier binding |
references/checks-grammar.md |
C4 A3 A10 C7 B2 A9 C25 B4 B5 B12 C12 C13 C27 C14 D8 |
tense drift, modal passive, -ing chains, dropped subjects, contractions, unquantified degrees, broken comparatives, prohibitions with no action, inline enumerations, list mechanics, mixed modes, articles |
references/checks-structure.md |
F2 F3 F5 F7 C11 C21 C24 |
two actions per step, unnumbered steps, limits hidden in notes, imperatives in overviews, tangled or disconnected paragraphs, prose duplicating a table |
references/checks-safety.md |
G5 G6 G7 G9 G10 G11 |
wrong severity, mixed label vocabulary, warning after the command, over-long warnings, warnings in reference docs, prohibition only in a lead-in |
references/checks-punctuation.md |
C10 C28 C18 E15 D3 D4 D6 D11 D12 D13 D14 |
semicolons, ambiguous commas, heavy parentheticals, hyphen questions, dropped that, with/using, any/since/over, e.g., gendered terms, apostrophes, false friends |
references/registry.md is the authoritative index: every id, tier, citation, home, and the
retired list. If any file and the registry disagree, the registry wins.
Rewriting method (9.1)
- Rewrite a defective sentence whole, not one flagged word at a time. Rules interact.
- A substitute must keep the meaning and the part of speech. Awkward output means the
construction is the problem, not the word.
- Ask two questions before rewriting an unclear sentence: what does the vague word mean here, and
what must the reader do?
- When a sentence resists rewriting: split it, delete information that is not necessary, or get
the missing fact from the engineer who owns the system. Never simplify by deleting the
information a sentence carries.
- After edits, grep for what the edit broke: renamed terms, "see step 4", "as described above".
Stop rule
Stop and report what you stopped on when any of these is true:
- The sentence is understood on the first read. Further edits are taste (
9.1).
- The next change alters the technical claim. Discard the fix (
1.2).
- The remaining defect needs a fact you do not have. Name the fact.
- The check's own entry carves the hit out.
- A formatter, a template, or the house style guide owns the finding.
- You rewrote the same sentence twice and it is still unclear. Split it, cut it, or ask the
owner.
- The findings exceed what a reviewer will read. Rank by severity and cut the tail.
Self-lint order
- Classify every block, set the register dial, run the mask, load the glossary.
- Generative checks first, so the text they create gets linted: G1 (attach missing safety
blocks), G2 (shape them), F4 (promote misfiled steps), C12 (build vertical lists — catalog).
- Run
[M], then [M+J], then [J]. Within a tier: kernel checks first, then any catalog file
the symptoms made you load.
- Re-run step 3 once over any text you created or restructured. One re-run only. If the second
pass flags your own output, report the finding and stop.
- One span, one finding. Deduplicate to the most specific check. Entries name the owner of
contested words.
- Apply the stop rule.
Output contract
Severity is set by the consequence in context, never by tier or provenance:
- blocker — the defect can cause a wrong action on a destructive or irreversible path, or the
only available fix would change a technical claim (report it, never apply it).
- major — actor, referent, or condition ambiguity in procedural, safety, or incident text.
- minor — clarity and consistency defects in descriptive text.
- nit — polish, and
[EXT] / [GR-n] advisory items.
Review mode (default). Findings only, most severe first. Each finding: severity, check id,
citation (rule id, [EXT], or [GR-n]), the offending span, the rewrite, one line of rationale.
Never report a carved-out hit or something a formatter owns.
Rewrite mode. Only when the user explicitly asks for a rewrite. Return only the requested
text — no preamble, no summary. If a sentence needs a fact you do not have, append one line
naming the fact. Council and subagent runs never rewrite: they report findings only.
What this cannot do
The checks remove the form of slop. They cannot make a hollow paragraph true, and they cannot
tell whether a runbook states the rollback procedure at all. That needs a reader who knows the
system.
Attribution
Adapted from ASD-STE100 Simplified Technical English, Issue 9 (2025-01-15), copyright © ASD
(AeroSpace, Security and Defence Industries Association of Europe), https://asd-ste100.org.
This adaptation is unofficial and is not endorsed by ASD. It adapts the writing rules for
software, data, and ML engineering prose and deliberately omits the approved-word dictionary.
Items marked [EXT] are additions and are not part of the standard. Get the real standard from
ASD.
walle-ste v0.2 · 2026-07-31
1---2name: walle-ste3description: Simplify and proofread any technical writing against rules adapted from ASD-STE100 — Confluence pages, Jira tickets, PR review comments, PR bodies, READMEs, runbooks, ADRs, dbt/Cube descriptions, error strings. Use when asked to "simplify this doc", "de-slop this", "run an STE pass", "make this readable", or "run WALL-E over it", or when drafting/reviewing Confluence, Jira, or PR-comment prose. Review mode reports findings. Rewrite mode edits only when the user explicitly asks for a rewrite.4---56# WALL-E STE kernel78This file is the always-loaded kernel: 23 checks plus the machinery. The remaining 47 checks live9in `references/`. Every check has a stable id, a tier, a detection step, and a fix. Cite the check10id and the citation on every finding. A finding with neither is an opinion.1112## Precedence13141. **The house style guide beats this document.** Write the conflict down instead of resolving it15 silently per document.162. **Meaning beats every rule.** A fix that changes what the sentence claims is discarded (`1.2`,17 `9.1`). `drop` is not `delete` is not `truncate`. `stop` is not `terminate`. `retry` is not18 `rerun`.193. **Understood on the first read is the acceptance criterion and the tiebreaker** (`9.1`). The20 reader is a time-poor, competent engineer whose first language is not English, reading once, on21 a phone, at 03:00. Clumsy to a native skimmer is the price of unambiguous to everyone else.2223## Scope2425**Apply to:** READMEs, service and API docs, design docs, ADRs, runbooks, postmortems, migration26guides, release notes, PR and commit descriptions, tickets, review comments, error and log27strings, code comments, dbt and Cube descriptions, Confluence pages, durable Slack (pinned28summaries, handovers, decisions).2930**Never apply to:** code, identifiers, command syntax, quoted text (reproduce byte for byte,31including British spelling), marketing copy and essays (they need a voice), ephemeral chat, and32the glossary and style guide themselves. A formatter owns heading levels, line width, and bullet33characters. A template owns which sections a document must contain. These rules own the sentences.3435The standard's ~900-word approved dictionary is deliberately not applied. It cannot carry a README36or an ADR. What survives is its mechanism: one meaning per word, one name per thing, a small37controlled general vocabulary plus an open project glossary.3839If the project has a glossary or exception lists (phrasal verbs, `-ing` nouns), load them in the40mask stage. Without a glossary, terminology findings (E1–E4) are guesses — cap them at minor.4142## Register dial4344Set per block, after classification:4546- **strict** — procedural text, safety blocks, notes inside procedures, error and log strings.47 Every applicable check runs.48- **flavored** — descriptive prose: READMEs, ADR context, PR bodies, model descriptions. Suppress49 D3 (add `that`), D8 (articles), C21 (repeat the key noun), and C28 (comma readings). Everything50 else runs.5152## Stage 1 — classify each block5354Classify per block, not per document. A document that mixes types is normal. A block that mixes55types is the defect (`3.6`, `5#`, `6#`).5657| Type | Reader is | Verb form | Sentence cap |58|---|---|---|---|59| Procedural | doing | Imperative, verb first (`5.3`) | 20 words (`5.1`) |60| Descriptive | reading | Active declarative, no imperative (`6#`) | 25 words (`6.3`) |61| Safety (WARNING/CAUTION) | about to break something | Imperative or negative imperative (`7.2`) | 20 words (`5.1`) |62| Note | reading context | Declarative, never imperative (`5.5`) | 25 words, unlimited sentences |6364Tests: procedural means the reader types, clicks, or runs something here. Safety: if they get it65wrong, is the state recoverable by re-running something? No means WARNING. Yes, with a documented66recovery path, means CAUTION. No damage at all means NOTE (`7.1`).6768The caps are alternatives selected by block class. Never report "over 20 words" against a design69doc.7071## Stage 2 — mask, then lint7273Do this once, before any check runs:74751. Mask code spans, fenced blocks, and inline SQL.762. Mask quoted strings, UI labels, log lines, URLs, and file paths (`1.14` note, `8.6`).773. Mask identifiers: `snake_case`, `camelCase`, `kebab-case`, dotted paths, ticket keys, SHAs,78 image tags, instance types (`8.6`).794. Mask heading lines before any `-ing` check. `[EXT]` interpretation: `3.5` permits `-ing`80 technical nouns and says nothing about headings.815. Strip list markers and step numbers before any word count (`8.6`).826. Load the project glossary and exception lists if they exist.8384Every `rg` command below runs on the masked text. ripgrep's default engine covers everything here85except lookaround (`-P`, used only by D3).8687## Limits and counting8889| Limit | Value | Scope | Source |90|---|---|---|---|91| Procedural or safety sentence | 20 words | Per sentence | `5.1` |92| Descriptive or note sentence | 25 words | Per sentence | `6.3`, `5.5` |93| Paragraph | 6 sentences | Descriptive text only. A lead-in plus its list counts as one sentence | `6.6` |94| Prose noun cluster | 3 words | A hyphenated compound counts as 1 | `2.1`, `8.7` |95| Coined term or introduced short form | 3 words | Never abbreviate a term of 3 words or fewer | `1.9`, `2.2` |96| List lead-in and each item | The cap in force | Counted separately. Items share no budget | `8.4` |97| Safety block | 2–3 sentences | `[EXT]` — the source states no count, its examples do | — |9899**One word each:** a number (with its unit: `250 ms`, `4 TiB`), an abbreviation, an identifier or100flag, a quoted span or code span, a name, title, or label (**never paraphrase a name to satisfy a101limit**), a proper noun, a hyphenated compound, and a whole parenthetical (also checked separately102as its own sentence). Structural numbering is excluded entirely (`8.5`–`8.7`).103104Worked: ``Run `kubectl -n prod rollout restart deploy/feature-writer` and wait 90 seconds.`` is1055 words, not 11.106107## Tiers108109| Marker | Meaning |110|---|---|111| `[M]` | Mechanical detection, deterministic fix. Apply it. |112| `[M+J]` | Mechanical detection, semantic fix. One decision per hit. Never bulk-apply. |113| `[J]` | Judgement. The entry states the question to ask. |114| `[EXT]` / `[GR-n]` | Provenance flags: extension / advisory in the source. Cite them, never as rule ids. |115116Severity comes from consequence in context, never from tier or provenance (see Output contract).117118---119120# Kernel checks121122## Actors and verbs123124### A1 · Passive voice `[M+J]` `3.6`125- Catch: `rg -in '\b(is|are|was|were)\s+\w+(ed|en)\b'`. Agentful hits (`… by X`) are highest126 precision. On an agentless hit ask: by whom or by what? An answer means a violation.127- Discard: `by` naming a dimension or sequence (`partitioned by`, `followed by`), participial128 adjectives (`the failed shard`, `broken`, `hidden`, `frozen` — `3.3`), and false participles129 (`open`, `often`, `even`, `seven`, `token`, `red`, `golden`).130- Fix: promote the agent to subject. In a step, use the imperative. Or supply `you` / `we`.131- Exception, and it overrides the active-voice rule: **never invent a false actor.** Passive with132 a genuinely unknown agent is correct in descriptive text ("the offsets were corrupted" while133 root cause is open). A style rule must never manufacture a causal claim.134135### A5 · Nominalization `[M+J]` `3.7`, `1.13`136- Catch: `rg -in '\b(do|perform|conduct|carry out|make|give|provide|execute)\s+(a|an|the)\s+\w+(tion|ment|ance|ence|sis|al)\b'`.137 Also bare `the ask`, `a deploy`, `an ingest`, `the spend`.138- Fix: use the verb directly. "Perform a migration of the table" → "Migrate the table".139 Nominalization also hides the actor, so it compounds with A1.140141### A7 · Verb names no action, object, or direction `[M+J]` `1.12`142- Catch: `rg -in '\b(handles?|process(es)?|manages?|deal with|touch|address|support|update)\b'`.143 Also any transfer or motion verb with no source and no destination (`sync`, `promote`,144 `migrate`, `push`, `restore`, `cut over`): ask what object, from where, to where.145- Fix: name the exact operation, the object, and the endpoints. `update` is the worst umbrella146 verb: it hides `INSERT`, `UPSERT`, `MERGE`, `TRUNCATE`, and `DROP`.147- Exceptions: `update` naming the SQL operation, a dependency update, or a security update.148 `supports` with a named version or capability is precise.149150## Claims151152### B1 · Modal that hides a fact `[M+J]` Part 2 2-0-19153- Catch: `rg -n '\b(may|might|could|shall|ought|would)\b'` — lowercase only, which keeps the154 RFC 2119 exception mechanical.155- Fix: `may` → `can` (possibility) or `is permitted to`. `shall` → `must`. Conditional → state the156 condition: "If the lockfile is stale, the build breaks."157- Never convert a modal into a bare categorical claim. "Might break" and "breaks" are different158 claims (precedence rule 2).159- Exceptions: uppercase RFC 2119 keywords in a spec. Counterfactual `would` comparing a rejected160 option in an ADR. Past-ability `could` ("could not scale past 8 shards").161162### B3 · Abstract claim, no mechanism and no magnitude `[J]` `4.1`163- Ask: can a reader act on this, or predict the system's behavior from it? An effect with no164 mechanism and no magnitude fails. "Improves maintainability" → name what moved where, with165 numbers.166167### B8 · Unverifiable abstraction `[M+J]` `1.5`, `[EXT]`168- Catch adjectives `[EXT]`: `rg -in '\b(seamless|robust|powerful|cutting-edge|effortless|world-class|next-generation|revolutionary|blazing|elegant|intuitive|first-class|battle-tested|enterprise-grade)\b'`169- Catch verbs: `rg -in '\b(enables?|empowers?|streamlines?|operationali[sz]e[sd]?|fosters?|unblocks?|drives? (adoption|alignment|value)|delivers? value)\b'`170- Catch nouns: `rg -in '\b(estate|cadence|fabric|posture|surface area|north star|alignment|learnings|synerg\w+|ways of working)\b'`171- Test: point at the command, artifact, config, or measurable change it names. None means172 decoration. Fix: delete, or state the measured property.173174### B9 · Filler word `[M]` Part 2 2-0-13175- Catch: `rg -in '\b(just|simply|basically|actually|really|very|quite|essentially|of course|obviously|it is important to note that|it should be noted that)\b'`176- Fix: delete. `just` and `simply` also smuggle in a claim that the task is easy.177- `already` is `[M+J]`: keep it only where it names a prior stage or state.178- Owns these adverbs. D14 owns the adjective `actual`. `just-in-time` is a term — the hyphen is179 the boundary.180181### B10 · Reference point not stated `[M+J]` `[EXT]`182- Catch: `rg -in '\b(currently|at present|recently|soon|in the near future|as of today|going forward|at this time)\b'`183 plus bare `old`, `new`, `stale`, `legacy`, `outdated` as adjectives.184- Fix: state the version, date, threshold, or condition. Documentation outlives its writing. A185 vague relative adjective is a data-loss risk in retention and TTL docs.186- Exception: `now` in a log line or a step ("the queue is now empty"). Judge each hit.187188### B13 · Mixed or missing unit and time convention `[M+J]` `[EXT]`189- Catch: `rg -in '\b\d{1,2}\s?(am|pm)\b'`, bare `HH:MM` with no zone, `GB`/`GiB` mixed in one190 document, durations written two ways.191- Fix: ISO 8601 with an explicit zone, one byte-size convention, one duration format, stated once192 per project. Nothing else owns this check.193194### B14 · Rhetorical padding `[M+J]` `[EXT]`195- Catch: `rg -in '\b(in summary|in conclusion|to summari[sz]e|overall,|as mentioned above|as previously stated|it is worth noting|that said,|at the end of the day)\b'`196 and `rg -in 'not only .{0,60} but also|is(n.t| not) just .{0,40}(—|--|,) it'`197- Fix: delete the closing-summary paragraph — topic sentences already form the outline (C15). A198 needed summary goes first, as a `TL;DR`. Rewrite reversal constructions as plain statements. A199 list of exactly three parallel items where two are enough, or four exist, is padding.200201## Sentences and structure202203### C1 · Over-length sentence, and the shape of the split `[M+J]` `5.1`, `6.3`, `4.4`, `6.2`204Absorbs retired C2 (guard rails) and C16 (reconnect).205- Catch: tokenize with the counting convention, compare against the block's cap: 20 procedural206 and safety, 25 descriptive and note. One cap per sentence, selected by block class.207- Fix: split at a clause boundary into complete sentences. Then reconnect: mark a causal,208 contrastive, or sequential relation explicitly (`then`, `so`, `but`, `as a result`). Unmarked209 causation is fatal in incident write-ups.210- Guard rails: keep every article, auxiliary, and subject — telegraphic prose is a failed fix.211 Never let a word count invent a step boundary: a step is a stopping point.212213### C8 · Noun pile-up `[M+J]` `2.1`, `2.2`, `8.7`214- Catch: a run of four or more consecutive nouns and adjectives ending in a head noun. A215 hyphenated compound counts as one. Also any token with three or more internal hyphens.216- Fix, in this order:217 1. Unpack with a preposition, rewriting from the head noun backwards. If no preposition fits,218 the relationship is unknown — ask the owner.219 2. Rewrite a hidden action (`-tion`, `-ment`, `-ing`) as a verb.220 3. Hyphenate the sub-groups that genuinely bind.221 4. For an established name, write it in full once and introduce a short form of 3 words or222 fewer.223- When unsure which words bind, method 1 wins. Never guess with punctuation (`2.2`).224225### C9 · Buried conditional `[M+J]` `5.4`, `[GR-2]`226- Catch: `if`, `when`, `unless`, `after`, `once` appearing after the main verb of a step. Also a227 leading condition with no closing comma.228- Fix: condition first, closed with a comma. A skimming on-call reader executes the verb without229 the condition.230231### C15 · Paragraph and section structure `[M+J]` `6.4`–`6.6`, `9.4`232- Catch: more than 6 sentences in a descriptive paragraph (lead-in plus list = one sentence). Six233 is a ceiling, not a target.234- Outline test `[J]`: extract every heading and the first sentence of every paragraph, in order.235 That list must summarize the document. Failures: gaps, repeats, a heading doing the topic236 sentence's job, misordered sections. Fix section order before paragraphs.237- Opening sentence `[J]`: it must name the thing, say what it is for, and add something the name238 does not. `X is a service that Xs` is padding.239240### D1 · Unresolvable reference `[M+J]` `[GR-3]`, `[GR-4]`, `4.4`241- Catch: `rg -in '\bthis\s+(is|are|can|will|causes|means|makes|results|happens|breaks|fixes|allows|helps|should)\b'`,242 sentence-initial `This`/`These` with no following noun, and any pronoun with more than one243 number-matching candidate in reach.244- Fix: write `this <noun>`, or restate the cause outright. An ambiguous `it` in a runbook sends245 someone to restart the wrong service.246- Not a violation: a document-scoped `This` in an opening or closing sentence.247248## Words249250### E1 · Synonym rotation `[M+J]` `1.11`, `6.2`251- Catch: more than one member of an alias cluster in one document: {customer, client, account,252 user} · {job, task, DAG, pipeline, workflow} · {service, app, component} · {table, dataset,253 model, view} · {feature, attribute, field, column} · {deploy, ship, release, roll out} ·254 {delete, remove, drop, purge}.255- Fix: one name for one thing, repeated every time. Variation reads as significance and sends256 readers hunting for a difference that does not exist.257258### E5 · Abbreviation failures `[M+J]` `2.2` M1, `8.3`, `6.6`259- Catch: all-caps tokens of 2–6 characters with no `Full Term (ABC)` expansion earlier in the260 same document. Four defects: never expanded · the long form reappears after the definition ·261 an abbreviation for a term of 3 words or fewer · abbreviation soup inside a procedure (write262 terms out in steps even when defined — this overrides defect 2 there).263- The introduced short form must itself be 3 words or fewer.264- Exempt: terms universal in the field — `SQL`, `API`, `HTTP`, `JSON`, `CSV`, `UTC`, `ETL`,265 `GPU`, `CI`.266267### E8 · Inflated word `[M+J]` `1.12`, Part 2 recurring errors268- Replace: utilize/leverage→use · commence/initiate→start · facilitate→help ·269 ensure/assure→make sure that · prior to→before · subsequent to→after · subsequently→then ·270 in order to→to · in the event that→if · a number of→some · regarding/concerning→about ·271 obtain/acquire→get · demonstrate→show · transmit→send · additionally/furthermore/moreover→also ·272 however/nevertheless→but · therefore/hence/consequently→as a result ·273 simultaneously/concurrently→at the same time · portion→part · instantiate→create ·274 orchestrate→run, schedule · surface (v)→show · action (v)→do · aforementioned→name the thing.275- Fix: apply the replacement, then reread. A different part of speech means restructure, not276 force the swap (`9.1`).277- Exceptions: `INSERT`, `EXECUTE`, `MATERIALIZE`, `ROTATE` as commands. `provision` in278 infrastructure. **`terminate` is not a synonym for `stop`:** terminating an AWS instance279 destroys it. Never rewrite the technical sense.280- Owns `ensure`, `in order to`, `surface (v)`. Do not also report them under D6 or B9.281282## Procedures283284### F1 · Step that is not a clean imperative `[M+J]` `5.3`, `3.6`285- Catch: `rg -in '^\s*[0-9]+[.)]\s+(The |You must|You should|You need to|You will need to|You have to|It is necessary to|We |.*\b(is|are) to be\b)'`286- Fix: start every step with an imperative verb. Delete `you must` from steps — a step is already287 an order. Reserve `must` for safety blocks and stated limits: once every step says must, the one288 that truly must is invisible.289- A step can open with its condition (C9). F1 rejects a step whose command is not imperative.290291### F4 · Load-bearing note `[M+J]` `5.5`292- Catch: `NOTE:` / `[!NOTE]` / `[!TIP]` blocks containing an imperative (including `Make sure`,293 `Ensure`, `Be aware`, `Remember to`) or `you must` / `you need to`.294- The delete-the-notes test: strip every note and tip, read the remaining steps, and ask whether a295 competent stranger can still finish. Any gap is a step misfiled as commentary. Run it as a296 ritual, not a judgement call.297- Fix: rewrite the note as an imperative step, insert it at the right point (usually before the298 step it was attached to), re-run the test.299300## Safety301302Attach a safety block to: `DROP` / `TRUNCATE` / `DELETE` with no `WHERE` · `git push --force` ·303`terraform apply|destroy` in prod · `kubectl delete ns|pvc` · `dbt run --full-refresh` · an304unbounded backfill or replay · key or credential rotation · a prod schema migration · Kafka topic305deletion · an index rebuild.306307### G1 · Destructive operation with no warning `[M+J]` `7#`308- Catch: scan for the trigger list. For each hit, check that a safety block sits immediately309 before that step.310- Fix: attach one. Danger must be a labeled element, not a tone of voice. The block must pass G2.311312### G2 · Safety block shape `[J]` `7.1`–`7.3` — runs on every safety block, never skipped313- Shape: `<LABEL>: <command or condition>. <consequence>.` Three slots, fixed order, none314 optional.315 1. Label first token: `WARNING:` (irreversible or externally visible) · `CAUTION:` (recoverable316 with a documented path) · `NOTE:` (no damage).317 2. First sentence: an imperative, negative imperative, or condition clause. Never a noun318 phrase, never `There is`, never a passive.319 3. Consequence: what happens if the reader ignores it. Omit only if genuinely uncharacterizable,320 and then say what is uncertain (`7.3`).321- Case is a house choice (`7.1` note). The label word carries the severity, not the formatting.322323### G3 · Vague warning `[M+J]` `7.1`, `7.3`324- Catch: `rg -in 'be careful|take care|use caution|proceed with caution|is critical|is imperative|is essential|at your own risk|may have unintended consequences'`325 plus softened consequences inside a safety block: `rg -in '\b(impacted|affected|inconsistencies|unexpected behaviou?r|issues|problems|degraded experience)\b'`326- Fix: name the action and the outcome with blunt words: `deleted`, `lost`, `unrecoverable`,327 `outage`, `leaked`, `corrupted`, `overwritten`, `stale`. Softening the harm is what makes a328 warning get skimmed.329330---331332# The catalog333334**Hard gate: never report a finding for a catalog check without first reading its entry in the335reference file.** The entries carry the carve-outs that stop this tool from mangling correct336prose. Kernel checks above are exempt — their carve-outs are co-located here.337338| File | Checks | Open it when you see |339|---|---|---|340| `references/checks-words.md` | E2 E3 E4 E6 E7 E13 A6 D10 | one action worded three ways, paraphrased asset names, phrasal verbs, slang, capitalized common nouns, verbed nouns, ambiguous modifier binding |341| `references/checks-grammar.md` | C4 A3 A10 C7 B2 A9 C25 B4 B5 B12 C12 C13 C27 C14 D8 | tense drift, modal passive, `-ing` chains, dropped subjects, contractions, unquantified degrees, broken comparatives, prohibitions with no action, inline enumerations, list mechanics, mixed modes, articles |342| `references/checks-structure.md` | F2 F3 F5 F7 C11 C21 C24 | two actions per step, unnumbered steps, limits hidden in notes, imperatives in overviews, tangled or disconnected paragraphs, prose duplicating a table |343| `references/checks-safety.md` | G5 G6 G7 G9 G10 G11 | wrong severity, mixed label vocabulary, warning after the command, over-long warnings, warnings in reference docs, prohibition only in a lead-in |344| `references/checks-punctuation.md` | C10 C28 C18 E15 D3 D4 D6 D11 D12 D13 D14 | semicolons, ambiguous commas, heavy parentheticals, hyphen questions, dropped `that`, `with`/`using`, `any`/`since`/`over`, `e.g.`, gendered terms, apostrophes, false friends |345346`references/registry.md` is the authoritative index: every id, tier, citation, home, and the347retired list. If any file and the registry disagree, the registry wins.348349## Rewriting method (`9.1`)350351- Rewrite a defective sentence whole, not one flagged word at a time. Rules interact.352- A substitute must keep the meaning and the part of speech. Awkward output means the353 construction is the problem, not the word.354- Ask two questions before rewriting an unclear sentence: what does the vague word mean here, and355 what must the reader do?356- When a sentence resists rewriting: split it, delete information that is not necessary, or get357 the missing fact from the engineer who owns the system. Never simplify by deleting the358 information a sentence carries.359- After edits, grep for what the edit broke: renamed terms, "see step 4", "as described above".360361## Stop rule362363Stop and report what you stopped on when any of these is true:3643651. The sentence is understood on the first read. Further edits are taste (`9.1`).3662. The next change alters the technical claim. Discard the fix (`1.2`).3673. The remaining defect needs a fact you do not have. Name the fact.3684. The check's own entry carves the hit out.3695. A formatter, a template, or the house style guide owns the finding.3706. You rewrote the same sentence twice and it is still unclear. Split it, cut it, or ask the371 owner.3727. The findings exceed what a reviewer will read. Rank by severity and cut the tail.373374## Self-lint order3753761. Classify every block, set the register dial, run the mask, load the glossary.3772. Generative checks first, so the text they create gets linted: G1 (attach missing safety378 blocks), G2 (shape them), F4 (promote misfiled steps), C12 (build vertical lists — catalog).3793. Run `[M]`, then `[M+J]`, then `[J]`. Within a tier: kernel checks first, then any catalog file380 the symptoms made you load.3814. Re-run step 3 once over any text you created or restructured. One re-run only. If the second382 pass flags your own output, report the finding and stop.3835. One span, one finding. Deduplicate to the most specific check. Entries name the owner of384 contested words.3856. Apply the stop rule.386387## Output contract388389Severity is set by the consequence in context, never by tier or provenance:390391- **blocker** — the defect can cause a wrong action on a destructive or irreversible path, or the392 only available fix would change a technical claim (report it, never apply it).393- **major** — actor, referent, or condition ambiguity in procedural, safety, or incident text.394- **minor** — clarity and consistency defects in descriptive text.395- **nit** — polish, and `[EXT]` / `[GR-n]` advisory items.396397**Review mode (default).** Findings only, most severe first. Each finding: severity, check id,398citation (rule id, `[EXT]`, or `[GR-n]`), the offending span, the rewrite, one line of rationale.399Never report a carved-out hit or something a formatter owns.400401**Rewrite mode.** Only when the user explicitly asks for a rewrite. Return only the requested402text — no preamble, no summary. If a sentence needs a fact you do not have, append one line403naming the fact. Council and subagent runs never rewrite: they report findings only.404405## What this cannot do406407The checks remove the form of slop. They cannot make a hollow paragraph true, and they cannot408tell whether a runbook states the rollback procedure at all. That needs a reader who knows the409system.410411## Attribution412413Adapted from ASD-STE100 Simplified Technical English, Issue 9 (2025-01-15), copyright © ASD414(AeroSpace, Security and Defence Industries Association of Europe), <https://asd-ste100.org>.415This adaptation is unofficial and is not endorsed by ASD. It adapts the writing rules for416software, data, and ML engineering prose and deliberately omits the approved-word dictionary.417Items marked `[EXT]` are additions and are not part of the standard. Get the real standard from418ASD.419420walle-ste v0.2 · 2026-07-31