Cut the sentences that say nothing.
Model prose fails quietly. It frames a claim, pads it, hedges it, then closes with a summary of the paragraph above. noobvious is a skill that teaches an agent twelve tells to catch that in its own draft, plus three tests to decide what stays.
npm i @qexle/noobvious && npx skills experimental_sync
-y
- 12tells the agent reads
- 3tests per sentence
- 38rules the checker runs
Version.
qany is at v0.3.0.
The CLI and MCP interfaces may change before 1.0.
after the cut
Version 0.3.0. Command and tool names can change until 1.0.
The tells
Twelve shapes. The agent reads its own draft against them.- labelA label that names its own field, like "Version." above a version number. Let the value carry it.
- pasteA sentence that would fit in any other project. Name the specific fact, or cut it.
- headingA section that opens by restating its heading. Start at the second sentence.
- twiceThe same claim in the intro and again in the body. Keep the copy that carries the numbers.
- restatementA question answered by restating it. Answer with the fact the reader asked for.
- hedge"may" or "can potentially" on something you measured. Give the number.
- definitionA definition that agrees with its noun. Say what it produces.
- paddingThree bullets where one carries the point. Cut the other two.
- sign-offA closing line that asks for nothing. Delete it.
- pointerA reference to output the reader can already see. Cut it.
- qualifier"very", "quite", "significantly", "essentially". Cut the word, then check the sentence still means the same thing.
- modestyPraise in front of a real result. Lead with the result.
three tests, one sentence at a time
- What did the reader learn from this sentence?
- Could this sentence sit in someone else's README?
- Does the label say anything the value does not already say?
A sentence that fails any of them goes. A tutorial, a safety notice, and an API reference keep the repeats they need.
The mechanical pass
Thirty-eight rules with a fixed shape. The checker runs offline, on your machine, with no model in the loop.| family | shape | fix |
|---|---|---|
| frame | a wrapper around a clause that already carries the claim |
cut the frame, keep the clause:
it is important to note that
|
| opener | throat-clearing before the content starts | start with the content: let's dive into |
| closing | a summary marker that repeats the text above it | delete the marker: in conclusion |
| claim | a claim nobody sourced | name the source: it is widely believed that |
| redundant | a word group that says less than the plain version |
use the short form: in order to,
due to the fact that
|
| hedge | stacked qualifiers on one verb | keep one: could possibly |
| repeat | two sentences or phrases carrying the same content | say it once: a list item that restates the list above it |
A run
Six of the twelve findings from a real run.Exit code 1 when a file has an error, so the check drops into a pipeline. --json gives the same findings as data, and --strict fails the run on warnings too.
Install
Node 20.10 or newer. Bun works the same way.install the skill
npm i @qexle/noobvious
npx skills experimental_sync -y
The sync command finds the bundled skill in node_modules and installs it into the agents on the machine. The skill ends by shelling out to the checker, so install the package globally too: npm install -g @qexle/noobvious.
run the checker
npx @qexle/noobvious README.md
Add --stdin to read a draft from a pipe, or point it at a folder of markdown. The checker catches the phrase-level tells on its own and cannot judge meaning.
run it as a server
{
"mcp": {
"servers": {
"noobvious": {
"command": "npx",
"args": ["-y", "@qexle/noobvious", "mcp"]
}
}
}
}
What it cannot do
- It cannot tell whether a sentence is true. It reads form, not meaning.
- It does not know your audience. Some repetition earns its place in a tutorial or a contract.
- It reads markdown, mdx, and plain text. Code blocks and inline code are skipped.
- The rules are English only.
- Every hit can be silenced. Put <!-- noobvious: ignore --> above a line, or wrap a block between ignore start and ignore end.