| name | critique-argument |
| description | Reviews argumentative prose - essays, proposals, position papers, recommendation memos, strategy docs, and op-eds - against the Toulmin model of argument: whether the claim, grounds, warrant, backing, qualifier, and rebuttal are present, explicit, and actually hold together. Judges the argument's structure, not prose readability or sentence mechanics (critique-clarity covers that). Use when the user asks for a review, feedback, a second opinion, a red-line pass, a quality check, or a critique of whether an argument holds up before it goes out. |
| version | 0.1.0 |
| license | Apache-2.0 |
| rubric_sources | [{"id":"TOULMIN","citation":"Toulmin, S. E. (2003). The Uses of Argument, updated edition. Cambridge University Press. ISBN 978-0521534333, ch. 3, The Layout of Arguments.","url":null,"accessed":"2026-07-31T00:00:00.000Z","operationalization":"paraphrased"}] |
| checks | {"scripted":["TOULMIN-CLAIM-MARKER","TOULMIN-HEDGE-DENSITY"],"judged":["TOULMIN-BACKING","TOULMIN-CLAIM","TOULMIN-GROUNDS","TOULMIN-QUALIFIER","TOULMIN-REBUTTAL","TOULMIN-WARRANT"]} |
critique-argument
Reviews argumentative prose against the Toulmin model of argument, asking whether a reader can
reconstruct why the conclusion follows: is there a single stated claim, is it attached to checkable
grounds, is the principle licensing the move from grounds to claim explicit, is that principle itself
supported, does the claim's asserted strength match its evidence, and does the argument name the
conditions that would defeat it. The full criterion registry, with each criterion's operationalization,
operational test, severity anchors, and lane, is references/TOULMIN.md.
Artifact claim
This skill critiques argumentative prose: essays, proposals, position papers, recommendation
memos, strategy documents, op-eds, and any document whose purpose is to get a reader to accept a
conclusion. Markdown or plain text.
It evaluates the structure of the argument, not the truth of its content. Whether the grounds an
artifact cites are factually correct, whether a cited study replicates, whether the numbers add up:
none of that is a TOULMIN-* question, and a finding that turns on it is out of scope. The claim
this skill makes is that a reader could or could not reconstruct the argument from what the artifact
supplies, and that claim is answerable from the artifact alone.
Three criteria (TOULMIN-BACKING, TOULMIN-REBUTTAL, TOULMIN-WARRANT) turn on what a reader
would grant without being told, which is the one place this skill could smuggle in knowledge the
artifact does not carry. references/TOULMIN.md's target reader section defines that reader
once, with an explicit default for the usual case where the artifact names no audience. Sweep those
three against that definition, not against an audience imagined for the occasion; that is what keeps
the artifact-alone claim above true rather than aspirational.
Two adjacent requests belong to other skills. Prose that is hard to read but argues nothing is
critique-clarity. A documentation page whose mode is wrong is critique-docs. An argumentative
document can of course have those problems too; this skill does not report them.
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.
-
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.
-
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.
-
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.
-
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
. Add if a threshold was supplied.
The sweep order for this skill
Ascending ID order puts the criteria in this sequence, which is not the order Toulmin presents the
model in and is not meant to be:
TOULMIN-BACKING, TOULMIN-CLAIM, TOULMIN-CLAIM-MARKER, TOULMIN-GROUNDS,
TOULMIN-HEDGE-DENSITY, TOULMIN-QUALIFIER, TOULMIN-REBUTTAL, TOULMIN-WARRANT.
Sweeping backing before warrant, and warrant last, is deliberate friction: a fixed order that does not
follow the argument's own shape is what keeps pass 2 from turning into a single narrative reading that
finds whatever the artifact's opening suggested. Each criterion is evaluated against the whole
artifact on its own terms. Where one criterion's test refers to another's result (TOULMIN-BACKING
and TOULMIN-QUALIFIER both refer back to work done under other criteria), do that referenced work
again inside the criterion currently being swept rather than deferring the criterion until later.
What the scripted lane does not decide
scripts/checks.py implements exactly two criteria, TOULMIN-CLAIM-MARKER and
TOULMIN-HEDGE-DENSITY. Both are measurements, not verdicts on the argument
(ADR 0017):
- A clean
TOULMIN-CLAIM-MARKER result is not evidence the claim is adequate. TOULMIN-CLAIM is
still swept in full, by judgment, on its own operational test.
- A clean
TOULMIN-HEDGE-DENSITY result is not evidence the claim is qualified correctly.
TOULMIN-QUALIFIER is still swept in full, against the grounds rather than against a count.
The reverse also holds: neither scripted finding is grounds for raising a judged finding's severity.
They are separate defects and they are counted separately.
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 the
judged lane, which is six of this skill's eight criteria, 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.
Both lanes rank on one key, so a mixed-lane envelope is ordered by a single rule and two runs
over the same artifact emit the same findings in the same order: severity descending, then criterion
ID ascending, then location. That is skills/_shared/envelope.py's own _rank_key, which
merge.py applies to the combined pool, and it is what makes this skill's run-to-run consistency a
property of the protocol rather than an accident of which defect the sweep noticed first. F-NNN
ids are assigned after ranking, never in discovery order, which is also merge.py's job.
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: that gets swept on the same terms as the rest of
the artifact, with a stripped_context entry noting what was disregarded.
This matters more here than in most domains, because an argumentative artifact usually arrives with
its author's own case for it attached. A cover note explaining why the counterargument was left out,
or asserting that the warrant is obvious to the intended audience, is exactly the material
TOULMIN-REBUTTAL and TOULMIN-WARRANT are asking the artifact itself to carry. Strip it, sweep the
artifact as a reader would meet it, and record the strip.
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-argument), 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/argument.py; see
bench/generator/README.md for what it must cover.