Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
21 changes: 21 additions & 0 deletions .agents/skills/simple-english/LICENSE
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
MIT License

Copyright (c) 2026 AminBlg

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
93 changes: 93 additions & 0 deletions .agents/skills/simple-english/SKILL.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,93 @@
---
name: simple-english
description: |
Write or rewrite text in plain, layman-readable English in the spirit of
ASD-STE100 Simplified Technical English: short sentences, active voice,
simple tenses, one word one meaning, condition before command, every
technical term defined at first use, no AI slop. Default mode is Plain.
Strict mode applies full STE vocabulary compliance when the user names
STE, ASD-STE100, or compliance. Use for documentation, READMEs, runbooks,
procedures, error messages, release notes, incident reports, API guides,
and explanations for readers outside the field. Also use when the user
says "STE", "Simplified Technical English", "ASD-STE100", "plain English",
"layman's terms", "explain it simply", "no jargon", "de-slop", "make this
readable", "write for non-native readers", or asks for docs that translate
well. The same rules govern the reply: answer first, prose only.
license: MIT
compatibility: claude-code cursor codex gemini-cli opencode
metadata:
version: "2.1.0"
standard: ASD-STE100 Issue 9 (2025-01-15)
---

# Simple English

Write plain English that a smart reader outside your field understands on one read. The rules come from ASD-STE100, the controlled language aerospace uses so a tired mechanic cannot misread an instruction. Two registers exist: the document you write or rewrite, and the reply you type in chat. Each has its own short rule set below. Nothing else in this file is optional.

## The Document

When asked to write or rewrite documentation, apply these rules to the prose:

1. **Classify each passage.** Procedural text tells the reader what to do: imperative mood, 20 words per sentence, one instruction per sentence. Descriptive text explains: simple tenses, 25 words per sentence, one topic per paragraph, six sentences per paragraph at most.
2. **Never touch** code, identifiers, commands, flags, file paths, quoted errors, product names, or facts. When the source gives no number or cause, keep the general statement.
3. **Condition before command, with a comma.** "If the build fails, read the log."
4. **Simple tenses, active voice.** No present perfect ("has completed" → "completed"). No "-ing" verb after a comma (", making it easy" → new sentence). Name the actor: "You run the migration."
5. **Modals: can, will, must.** Never should, would, may, might, could. A required "should" becomes "must". An optional one is deleted.
6. **Complete grammar.** No contractions, keep articles, keep "that". Short sentences, not telegraph style.
7. **No semicolons and no em-dashes.** Write two sentences, or name the relation.
8. **One word, one meaning, for the whole document.** Use `make sure that` for check, verify, confirm, validate, ensure. Use `configuration` for config, settings, options. Break noun chains over three words with a preposition ("the timeout value for the connection pool").
9. **State what the reader needs before you name the action.** Define a concept term at its first use, under ten words, one per sentence. Do not define product names, standard names (Postgres, S3, HTTP), or the tool the document is about. The same rule covers a fact, not just a word: name the host, the flag, or the prior step that a command depends on, instead of assuming the reader already has it. "Restart the service" becomes "Restart the `sync` service on the host that runs the job."
10. **State the fact, not its importance.** Delete words that carry no fact: simply, seamlessly, robust, powerful, comprehensive, leverage, crucial, "in order to", "it is worth noting". No "not just X, it is Y". No decorative triplets. No "in conclusion".
11. **Format for the eye, not for decoration.** No bold lead-ins, no bold as emphasis, no emoji, no heading over two sentences. A vertical list is for three or more parallel items or steps: colon on the lead-in, uppercase start, one instruction per item.
12. **Warnings: command or condition first, then the risk.** "Do not run this against production. The command deletes rows."

Use American spelling. `references/word-swaps.md` maps the overused words to plain ones. For an error message, a runbook, an incident report, release notes, a commit message, or UI copy, read `references/use-cases.md` first: it names the mode and the pattern for each.

**Before (real AI output):**

> **Connection timeouts.** If sqlpipe hangs or fails with `dial tcp: i/o timeout`, check that the host running sqlpipe can reach the Postgres port (usually 5432) — this is often a security group or firewall rule blocking the connection. If you're connecting to a managed database (RDS, Cloud SQL, etc.), confirm the instance allows connections from sqlpipe's IP.
**After (procedural, headed, numbered):**

> ## Connection timeouts
>
> sqlpipe stops with `dial tcp: i/o timeout` when it cannot connect to the Postgres port (5432 by default).
>
> 1. Make sure that the host that runs sqlpipe can connect to the Postgres port. A firewall or security group usually blocks it.
> 2. If the database is managed (RDS, Cloud SQL), make sure that the instance accepts connections from the IP of sqlpipe.
## The Reply

Every chat reply, in every mode, follows these rules. Read them last, apply them first:

1. Answer in prose. No headers, no bullet lists, no bold, no tables. A code block is legal when the reader must copy it.
2. The first sentence gives the answer or the result. Do not restate the question.
3. No em-dashes. Name the relation ("because", "but", "for example") or write two sentences.
4. Define a concept term in a few words the first time you use it: "idempotent (safe to run twice)". Do not define product names.
5. No contractions. No openers ("Certainly", "Great question") and no closers ("I hope this helps", "Let me know").
6. Do not shorten quoted error text, security warnings, or confirmations before a destructive action.

**Before:** The failure stems from control-plane leader election during pod churn — nothing to worry about!
**After:** The pods restarted and the queue lost its leader for a short time. It recovered without help. You do not have to do anything.

## Self-Check Before You Deliver

1. Reply: search for `—`, `**`, `#`, and a line that starts with `-`. Remove each one.
2. Document: count the words in your three longest sentences. Over 20 or 25, split. Search for `'`, `has been`, `should`, `may`, `;`, `—`, `, making`, `**`, `check`, `verify`, `config`, and any heading that covers fewer than three sentences. Fix each hit. Read each step: does it name a host, a flag, or a prior step the reader must already have? If not, add it or point to it.

## Modes

**Plain** is the default and is all of the above. **Strict** applies when the user names STE, ASD-STE100, or compliance: read `references/strict-vocabulary.md` before you draft the document, and say once that no tool guarantees compliance. The reply stays Plain in every mode.

When asked to CHECK text instead of writing it, first open `references/rule-catalog.md`. Then report each violation as: rule number quoted from that file, the offending text, a compliant rewrite. Never cite a rule number from memory. When the user asked for compliance, end with one sentence: no tool can guarantee ASD-STE100 compliance, and the standard is a free download at asd-ste100.org.

## Limits

These rules are for facts and instructions, not marketing copy or brand writing: they delete persuasion by design. Say so, and offer them for the docs instead.

## References

- `references/rule-catalog.md` — the 53 rules of Issue 9 with software examples, for CHECK mode
- `references/strict-vocabulary.md` — the dictionary discipline for Strict mode
- `references/word-swaps.md` — slop-to-plain word map
- `references/use-cases.md` — mode and pattern for error messages, runbooks, incident reports, release notes, commits, agent prompts, UI copy, translation prep
36 changes: 36 additions & 0 deletions .agents/skills/simple-english/UPSTREAM.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
# Source of this skill

This folder holds a copy of the Simple English skill from [AminBlg/SimpleEnglish](https://github.com/AminBlg/SimpleEnglish), at commit `79b590fc8596523d92c26b1ea7e33236606ef069`. The project uses the MIT license. The license text is in `LICENSE`.

## Files from the upstream project

These files are copies of upstream files:

| File in this folder | File in the upstream project |
| --- | --- |
| `SKILL.md` | `skills/simple-english/SKILL.md` |
| `references/rule-catalog.md` | `skills/simple-english/references/rule-catalog.md` |
| `references/strict-vocabulary.md` | `skills/simple-english/references/strict-vocabulary.md` |
| `references/use-cases.md` | `skills/simple-english/references/use-cases.md` |
| `references/word-swaps.md` | `skills/simple-english/references/word-swaps.md` |
| `references/system-prompt.md` | `prompts/system-prompt.md` |
| `scripts/ste_lint.py` | `evals/ste_lint.py` |
| `scripts/slop.tsv` | `evals/slop.tsv` |
| `LICENSE` | `LICENSE` |

Two copies have a change:

- In `scripts/ste_lint.py`, the `strip_code` function keeps the newlines that it removes. In the upstream version, each line number after a code block or a table is too small. The hook compares these line numbers with `git diff`, so the numbers must be correct. The change does not change the violation counts.
- In `references/rule-catalog.md`, the blank line at the end of the file is removed. The `end-of-file-fixer` pre-commit hook of this repository requires one newline at the end of each file.

## Files for this repository

`scripts/hook.py` is the hook script for Cursor, Claude Code, and Codex. It replaces the two upstream hook scripts, `src/hooks/simple-english-activate.js` and `src/hooks/lint_hook.py`. The upstream scripts read the layout of a plugin, and they support Claude Code and Codex only. `scripts/test_hook.py` holds the tests for `scripts/hook.py`.

## Update the copy

1. Copy the upstream files in the table above into this folder.
2. Apply the two changes above again, if the upstream files still need them.
3. Change the commit at the top of this file.
4. Run `python3 .agents/skills/simple-english/scripts/test_hook.py`.
5. Run `python3 .agents/skills/simple-english/scripts/ste_lint.py --self-test`.
Loading
Loading