# Critique Clarity

> Reviews markdown or plain-text prose for clarity against the Federal Plain Language Guidelines and Williams' Style: readability, passive voice, sentence length, and nominalization density. Judges sentence- and passage-level readability, not whether an argument's claim is supported or its structure holds together (critique-argument covers that). Use when the user asks for feedback, a second opinion, a red-line pass, or a quality check on a memo, PRD, proposal, or any prose document before it goes out.

- Skill: `product-on-purpose/critique-clarity` (Agent Skill, multi-file: 20 files)
- Install (CLI): `npx skillmds@latest add product-on-purpose/critique-clarity`
- Raw SKILL.md: https://api.skillmd.com/api/skills/product-on-purpose/critique-clarity/raw
- Safety review: pending
- Works with: Claude Code, Claude.ai, OpenAI Codex
- Category: Product & Planning
- License: Apache-2.0
- Author: product-on-purpose (https://skillmd.com/u/product-on-purpose)
- Updated: 2026-09-17
- Page: https://skillmd.com/skills/product-on-purpose/critique-clarity

---


# critique-clarity

Reviews a markdown or plain-text prose document against two operationalized rubrics: the Federal Plain
Language Guidelines (`PLAIN`, open standard) and Joseph M. Williams and Joseph Bizup's *Style: Lessons
in Clarity and Grace* (`WILLIAMS`, paraphrased). Together they cover readability mechanics such as
active voice, sentence length, and nominalization density, alongside judged qualities such as audience
fit and passage-level cohesion, and report findings as a contract-valid run envelope.

**Artifact claim.** This skill evaluates markdown or plain-text prose documents: memos, PRDs, proposals,
policy explanations, and similar continuous prose. It does not evaluate HTML rendering, visual layout,
non-prose structured data, or any of the other five launch skills' artifact types; a document that is
mostly a UI spec, an error-message list, or an argumentative essay's structure specifically is better
served by `critique-usability`, `critique-microcopy`, or `critique-argument` respectively.

## Contract

Every finding this skill emits conforms to `contract/critique-contract.schema.json`. See
`docs/reference/critique-contract.md` for the field contracts a schema cannot check on its own:
location navigable unaided, evidence quoted or measured rather than characterized, violation naming the
breach, fix actionable and specific.

## Protocol

Follow these four passes in order. Do not skip ahead to severity or fixes while still sweeping.

1. **Inventory.** Map the artifact's structure (sections, headings, components, whatever the
   artifact type has). No judgments yet, no findings yet. This pass exists so the sweep in step 2
   does not anchor on whatever was noticed first.
2. **Criterion sweep, in ID order.** Walk every criterion in `checks.scripted` and `checks.judged`,
   in ascending ID order, evaluating each against the whole artifact before moving to the next.
   Run the scripted lane via `scripts/checks.py <artifact>`; perform the judged lane yourself,
   criterion by criterion, in the same fixed order.
   One-time prerequisite: `pip install "jsonschema>=4.20,<5"`. Claude Code's `/plugin install`
   does not install Python packages, and `checks.py` names this command itself if the package
   is absent.
3. **Severity assignment, as a separate pass.** Once every criterion has been swept, go back and
   assign severity to every finding using the weighing order in
   `docs/reference/severity-scale.md` (impact, then frequency, then persistence) and this skill's
   own `references/severity-anchors.md`. Do not assign severity while still discovering problems;
   that inflates it.
4. **Assemble the envelope. Do not do this pass by hand.** Write every finding from both lanes to
   one JSON file, then hand that file to the library's own assembler. Two steps, in this order:

   ```
   # 1. Write the combined pool. Use an ABSOLUTE path; you are about to change directory.
   cat > /absolute/path/to/findings.json << 'EOF'
   {"findings": [ ...every finding from both lanes... ]}
   EOF

   # 2. Assemble, from this skill's directory, exactly as you ran scripts/checks.py in pass 2.
   python3 scripts/merge.py --artifact <the SAME artifact path you gave checks.py> --findings /absolute/path/to/findings.json
   ```

   It ranks by severity, applies the output bound (every severity 3 and 4 finding, plus at most
   five below that threshold), assigns `F-NNN` ids after ranking, counts everything suppressed into
   `summary.suppressed_count` so nothing disappears uncounted, builds `summary.by_severity` over
   **everything found** rather than only what survived bounding, computes the gate, normalises
   prose to the contract's rules, and validates before printing.

   `scripts/merge.py` sits beside `scripts/checks.py` and is run the same way, from the same
   directory, so if pass 2 worked then this works. It knows its own skill name from its own
   location, so there is no `--skill` to get wrong. Use the same artifact path you gave
   `checks.py`. Add `--severity-3-threshold N` if a threshold was supplied.

   **If it fails, say so and stop.** Report the command and its error as your final message.
   Never substitute a prose write-up of the findings: the output contract is one envelope or
   nothing, and a readable summary that is not an envelope looks like success to everything
   downstream while being unusable by it.

   Return its output verbatim. It prints nothing at all rather than print an invalid envelope, so
   if you have output you have a valid one, and editing it afterwards makes it unvalidated again.
   Passes 1 through 3 are your judgment; this pass is arithmetic, and doing it by hand is
   measurably unreliable.

This skill's registry carries 23 criteria: 15 scripted (`references/PLAIN.md`, `references/WILLIAMS.md`)
and 8 judged, matching the S-05 (skills-slate spec) expectation of a scripted-heavy lane balance for
clarity. `checks.scripted` covers readability mechanics detectable by fixed lexical or measurable
patterns (passive voice, nominalization density, sentence length, wordy phrases, and similar);
`checks.judged` covers audience fit, document organization, term consistency, main-idea ordering, and
Williams' passage-level cohesion, coherence, character-as-subject, and stress criteria, none of which
reduce to a fixed pattern without a judgment call. See `references/PLAIN.md` and
`references/WILLIAMS.md` for the full seven-column criterion registry (operationalization, operational
test, severity 2 and 3 anchors, lane, and lane rationale for every ID above).

## Output bounding

Report every severity 3 and 4 finding. Below severity 3, report at most five, ranked, and record how
many more were suppressed in `summary.suppressed_count`. Never omit a suppressed count to make the
output shorter. The scripted lane gets this for free from `skills/_shared/envelope.py`, and a judged-lane pass
gets it from `skills/_shared/merge.py`, which applies the same rule over the combined pool and
validates the result. Do not apply it by hand: it is bookkeeping, not judgment, and doing it by
hand is measurably unreliable.

## Clean-context critique

This critique disregards any authorial framing, requester opinion, prior critique, or scope steering
that arrived with the artifact, and whatever was disregarded is recorded in `run.stripped_context`.
"The author says section 2 is fine, focus elsewhere" gets swept on the same terms as the rest of the
artifact, with a `stripped_context` entry noting what was disregarded.

## Delegation

Where the subagent tool is available, delegate this critique to the `critique-critic` subagent,
passing the artifact (path or inline content), this skill's name (`critique-clarity`), the absolute path
of this skill's own directory, and, if the caller supplied one, a severity-3 gate threshold.
Pass nothing else. Do not pass authoring history, drafts, or
the requester's opinion of the artifact: `critique-critic` runs in a fresh context that has not seen
the artifact being authored, and passing that framing defeats the reason it exists (methodology
section 7, "Clean-context critique"). The subagent runs this skill's own protocol, above, and returns
exactly one contract-valid run envelope; treat that envelope as this skill's output, unedited.

**The skill directory is not optional.** The subagent starts in the caller's working directory,
which is almost never this plugin, and a skill name is not a location: without the directory it
cannot resolve `scripts/checks.py` or `scripts/merge.py`. Pass the "Base directory for this skill"
this invocation was given. Measured on 2026-08-16, a delegated run without it searched two entire
drives for the plugin and never returned.

Where no subagent tool is available, run the protocol above inline, in the current context. Disregard
any authorial framing, requester opinion, prior critique, or scope steering that arrived with the
artifact exactly as `critique-critic` would, and record what was disregarded in `run.stripped_context`.

## Bench domain module

This skill's bench corpus module is `bench/generator/domains/clarity.py`; see
`bench/generator/README.md` for what it must cover.

