Methodology · rubric v7.0.0
How CLUX scores a CLI
Every CLUX report can be traced back to this page: the rubric the evaluator reads, the policy CLUX uses to turn ratings into a score, and the rules for what counts as evidence. The rubric sections are rendered from the same files that produce your score.
How it works
UX signals, optional rules, one report
CLUX runs up to two analyses. Each looks at the command from a different perspective, and each produces its own findings and fixes:
| Analysis | Question it answers | File | Output |
|---|---|---|---|
| UX heuristics | How good is the experience of using this command? | UXHeuristics.md |
Signal ratings → CLUX Score |
| Rules (optional) | Does the command follow the rules the user chose? | Conventions.md |
Rule verdicts (no score) |
How ratings become scores (weights, ranges, grade caps, coverage) is
defined in Scoring.md and applied by the server, not by the evaluator.
Evidence first, knowledge labelled
Every rating quotes the evidence you supplied, or says it rests on CLUX's knowledge of the command. CLUX never invents flags or behaviour.
Unknown is never ignored
A signal CLUX couldn't check stays in the score as an unknown. It widens the score's range instead of disappearing, so a score can't look perfect on thin evidence.
The evaluator is blind to the weights
It rates signals without seeing weights, ranges or grade bands, so they can't bias its ratings. CLUX applies them afterwards.
Ratings show certainty; rules stay binary
Ratings and findings say how sure the evaluator is. A rule is passed, violated, or can't verify when the evidence does not settle it.
From evidence to report
- 1
You supply evidence
A command name, its --help, real output and an error message. More real output means more signals can be checked and a narrower range.
- 2
The evidence is cleaned
Control characters are stripped and prompt-injection phrases neutralised. Your input is treated as data, never as instructions.
- 3
The evaluator rates every signal
A Claude model reads the UX heuristics below and rates each signal 0–4 for your audience, plus any rules you chose.
- 4
CLUX checks the output
The reply must match a strict structure. Signals the rubric marks N/A are forced to N/A, and ratings that don't state their basis become unknowns.
- 5
CLUX computes the result
Points, unknowns, weights, ranges, coverage and the grade cap are applied by fixed code, so the same ratings always produce the same score.
Two audiences
Human-first or AI-agent first
Every command is evaluated for one audience, chosen by the user:
- Human-first — a person using the CLI at a terminal.
- Agent-first — an AI agent or automation operating the CLI through text alone: help text, stdout, stderr and exit codes.
Judge only against the column for the selected audience. Where a signal is N/A for that audience, skip it.
Human-first
Built for a person using the CLI at a terminal.
Ease of Use 50% · Pleasantness 12% · Safety 18% · Security 12% · Accessibility 8%
AI-agent first
Built for an AI agent or automation operating the CLI through text alone: help text, stdout, stderr and exit codes.
Ease of Use 50% · Pleasantness 5% · Safety 24% · Security 21% · Accessibility 0%
The rubric
Rating the signals
The sections below are rendered from the same rubric file the evaluator reads, so this page and the evaluator can't disagree.
Read-only commands still receive a Safety assessment
CLUX does not remove Safety just because a command does not mutate state. It assesses whether the operation is clear, the query scope and matching rules are explicit, each result can be safely selected for the next command, and partial, stale or failed output cannot look complete. Only mutation-specific safeguards are N/A.
Two assessment levels, two honest claims
Command review assesses one command from its help, output and any genuine error response. If recovery has not been exercised, it stays unknown. Repository review applies the full rubric to a CLI-wide evidence bundle, including workflows, cross-command consistency and the complete team ruleset. The resulting scores answer different questions and should not be compared as if they had the same scope.
Rate every signal on this scale:
| Rating | Meaning |
|---|---|
| 4 | Target met, and shown directly in the evidence. |
| 3 | Target met, with a minor gap. |
| 2 | Partly met, or met in some places and not others. |
| 1 | Mostly not met; only a token effort. |
| 0 | Not met, or the command works against the target. |
| N/A | The rubric marks the signal N/A for this audience, or a command fact makes it N/A (see Command facts). |
| Can't verify | The signal applies, but neither the evidence nor CLUX's knowledge can settle it. |
At Command review level, Can't verify on ERR-4 through ERR-7 means recovery behaviour not exercised unless a genuine error transcript was supplied. It is neither a pass nor a finding. The report says what evidence would make it assessable.
In each table, the audience columns describe what 4 looks like and 0 looks like describes the failure. Ratings 1–3 fall between them.
Can't verify is not ignored. It counts as an unknown in the score and
widens the score's range (see Scoring.md). It is always better than a
guess.
Evidence rules
- Every rating from 0 to 4 states its basis — a short quote or a precise reference from the evidence, or, when it rests on knowledge (rule 4), what that knowledge is. A rating with neither is Can't verify.
- A 3 or 4 needs positive support. The absence of a visible problem is not proof of quality.
- Absence counts only where the evidence is complete. Complete help text is a contract: if the full help is supplied and a safeguard or flag is not documented, rate it as missing. If a signal depends on behaviour (error output, success output, interruption) and that behaviour was not supplied, return Can't verify. Where that behaviour is supplied — a transcript of real output or of an error — rate those signals from it and quote it. Answering them from knowledge instead throws the rating away (rule 4), and what the transcript shows counts even by its absence: output carrying no escape codes is real evidence for ACC-2.
- CLUX's knowledge may rate design-level signals. For a real,
widely used command, its default behaviour, what its verbs mean,
which sibling commands exist and which flags it documents may come
from CLUX's knowledge of that command. Mark such a rating as
knowledge. Knowledge can stand in only for
helpandrepoevidence (the Evidence column): what the command documents and what the rest of the CLI offers. A signal that onlyoutput,errororruntimeevidence can establish always needs supplied evidence, and CLUX enforces this. Behaviour that has to be observed — exact output, exit codes, error wording, prompts — still needs supplied evidence. Never invent a flag, subcommand or behaviour. - N/A is decided by the rubric, not by judgement. A signal is N/A only where its table marks it N/A for the audience, or where a command fact makes it N/A (see Command facts). Any other N/A counts as Can't verify: letting the evaluator choose which signals count would let it choose the score. Never rate a signal 4 because the thing it guards against doesn't exist for this command — report the fact instead. A 4 needs the quality to be present: output shown with no colour codes, say, is a 4 for ACC-2.
- Stay in scope. Signals whose evidence is
repocompare commands. Rate them only when the evidence contains more than one command from the same CLI, or from knowledge of a well-known CLI; otherwise return Can't verify. - Root cause once, knock-on effects where they land. Rate the root cause in the signal the notes under each table assign it to. If that problem also causes a separate, observable cost elsewhere, rate that cost in its own signal too, and say in the note which root cause it follows from. For example, a misleading verb is a Learnability problem (LRN-3); if it also forces users to read the help before a routine task, that costs Efficiency (EFF-6); if it keeps surprising people who already know the command, that costs Pleasantness (PLS-7). Never lower a signal for a cost the evidence doesn't show.
Evidence types
| Code | Evidence |
|---|---|
help |
Command name, usage line, --help, man page, documented flags and examples |
error |
Actual error output, with the exit code where available |
output |
Actual success output or a run transcript |
repo |
Other commands from the same CLI |
runtime |
Behaviour only observable by running the command or reading its source. Usually Can't verify from pasted text unless explicitly documented |
Each signal lists the evidence types that can establish it, strongest first.
Command facts
The evaluator reports four facts about the command. CLUX uses them — not the evaluator's judgement — to decide which signals are N/A. A signal whose subject doesn't exist for this command is N/A through a fact, never a 4: having no credentials is not good credential handling.
| Fact | When it is | For | These signals are N/A |
|---|---|---|---|
readOnly — it only reads state |
true | both audiences | SAF-2, SAF-4, SAF-5, ERR-7 |
handlesSecrets — it takes credentials or tokens, or can print sensitive data |
false | both audiences | SEC-1, SEC-2 |
interactive — it can prompt, or runs an interactive UI |
false | both audiences | ACC-4, EFF-3 |
interactive |
false | Human-first | PLS-3 |
showsProgress — it runs long enough to show progress, spinners or animation |
false | both audiences | PLS-4, ACC-6 |
selectsByName — it takes a name, identifier or search term to pick what it acts on or shows |
false | both audiences | EFF-7 |
When a fact is unclear, report the value that keeps the signals applicable.
Never being interrupted is not good or bad for a person in general: it depends on the task. So a command that can't prompt earns nothing on PLS-3 for Human-first. For Agent-first it still counts: a command that never prompts can't hang a script or an agent, which is real value.
The five dimensions
The rubric has five dimensions:
- Ease of Use — measured through three facets: Learnability, Efficiency and Error Tolerance. A CLI that rates well on all three is easy to use.
- Pleasantness
- Safety
- Security
- Accessibility
Accessibility is assessed for Human-first only. Agent-first assesses the execution contract instead: plain, structured output, stderr, exit codes and non-interaction belong to Efficiency, Error Tolerance and Safety.
The Ease of Use facets can trade off
A command can be very learnable yet slow for experts (a guided wizard), or fast for experts yet hard to learn (terse flags). This is common, and it is why many CLIs offer both interactive and non-interactive modes.
Therefore:
- Rate each facet on its own. A strong facet never lifts a weak one.
- A command that offers both a guided path and a direct path can rate well on Learnability and Efficiency.
- When Learnability and Efficiency diverge, the fix is usually to add the missing path — not to weaken the strong one.
1.1 Learnability
How quickly a first-time user forms a correct model of what the command does and how to invoke it.
| Signal | Human-first — 4 looks like | Agent-first — 4 looks like | 0 looks like | Evidence |
|---|---|---|---|---|
| LRN-1 Purpose discoverability | What the command is for is clear from its name and the first line of help | Purpose and operational principle are stated, so nothing has to be guessed | Purpose must be guessed from the flags | help |
| LRN-2 Invocation clarity | Usage line shows required vs optional arguments and their order | Invocation grammar is explicit: required, optional, repeatable and mutually exclusive parts are declared | Usage is missing or contradicts the examples | help |
| LRN-3 Naming clarity | Command, subcommand and flag names say what they do | Each name maps to exactly one concept and one action | Names are misleading, overloaded or internal jargon | help |
| LRN-4 Familiarity | Follows conventions users already know, so little is new | Follows conventions agents have strong priors for (--help, --version, --json, --) |
Familiar-looking forms behave unexpectedly | help, repo |
| LRN-5 Concept consistency | Knowledge transfers between similar commands | Patterns can be safely generalised across commands | The same concept has different names or behaviour across commands | repo |
| LRN-6 Outcome discoverability | The user can tell what will happen before running it | The intended state change can be determined before execution | The effect of running is unstated | help |
| LRN-7 Capability boundaries | Help makes clear what the command does not do | Unsupported actions are recognisable as unsupported; unknown flags and arguments are rejected, not silently ignored | Unknown input is accepted silently, inviting invented flags | help, error |
| LRN-8 Progressive disclosure | Common usage comes first; advanced options are separated | The full contract is available on request without trial and error | Everything is presented at once, or essential detail is hidden | help |
Notes:
- LRN-3 judges the name against the command's default behaviour (what
it does with no arguments). A verb that describes an optional mode
(
find→ search) while the default does something else (list) is misleading: rate 1 or lower, even if the help text explains it. Its finding is at least high severity (see Severity). - A name that misrepresents the default behaviour also limits what can be learned from it: rate LRN-1 2 or lower (the purpose can't be discovered from the name) and LRN-6 2 or lower (the outcome can't be predicted from the name), however clearly the help or documentation explains it. CLUX reports this as one judgement for the command and applies the LRN-1, LRN-3, LRN-6, PLS-7 and EFF-6 caps itself.
- LRN-4 judges only whether unfamiliar conventions cost learning.
Whether the command complies with a ruleset belongs to
Conventions.md. A command that answers--helpwith an error, or with no usage, breaks the most familiar convention of all: rate LRN-4 1 or lower. - LRN-5 owns all cross-command consistency.
- LRN-7 owns misfit resistance: an agent should be able to decline an unsupported action rather than invent a command or flag.
1.2 Efficiency
How cheaply someone who already knows the command gets the task done, repeatedly.
| Signal | Human-first — 4 looks like | Agent-first — 4 looks like | 0 looks like | Evidence |
|---|---|---|---|---|
| EFF-1 Task economy | The goal takes few steps, with no ceremony | The goal takes few calls and round trips | A routine goal needs several commands or repeated confirmation | help, output |
| EFF-2 Input burden | Defaults, config or environment variables remove repeated typing | State and context don't have to be resubmitted on every call | The same information is re-entered on every run | help |
| EFF-3 Expert path | Experts can bypass guided or interactive flows with flags, shortcuts or aliases | Every guided or interactive flow has a flag-driven, non-interactive equivalent | The only path is guided or interactive | help |
| EFF-4 Output economy | Output shows what matters; detail sits behind --verbose |
A machine-readable format (e.g. --json) is available, with little noise to parse |
The result is buried in noise; no machine-readable format | help, output |
| EFF-5 Composability | Repetitive work can be scripted: reads stdin, writes clean stdout, supports batches | Operations compose reliably; the machine output contract is stable and documented | Can't be piped or batched; output format changes without notice | help, output |
| EFF-6 Self-sufficiency | The task completes without looking things up elsewhere | Everything a call needs (IDs, names, valid values) can be obtained through the CLI itself | Required values must be found outside the CLI | help, repo |
| EFF-7 Input forgiveness | Names and search terms are forgiving: a partial, prefix or case-insensitive term finds the item, and a miss suggests the closest matches | Accepted forms of each name are documented, and a miss returns the closest valid values | Only an exact match works, and a miss gives no hint of what would have matched | output, help |
Notes:
- EFF-3 owns whether a fast path exists. PLS-3 owns whether prompts
appear unexpectedly. A command with no guided or interactive flow
has nothing to bypass: EFF-3 is N/A through the
interactivefact. - EFF-7 applies to commands that pick something by name, identifier or
search term (the
selectsByNamefact). Help that says "partial" or "alias" is not enough for a 3 or 4: rate it from a run that shows what a partial or near-miss term returns. Without that run, return Can't verify. - EFF-4 owns structured, machine-readable output for agents.
1.3 Error Tolerance
How well the command prevents mistakes, and how well the user recovers when something goes wrong.
| Signal | Human-first — 4 looks like | Agent-first — 4 looks like | 0 looks like | Evidence |
|---|---|---|---|---|
| ERR-1 Error prevention | Invalid or conflicting input is caught before anything happens | Invalid invocations are rejected before any side effect, naming the invalid parameter | Bad input is acted on, or the command fails midway | help, error |
| ERR-2 Error recognition | It is obvious that something went wrong | Failure is machine-detectable: a non-zero exit code, distinguishable from success | Failure looks like success, or exits 0 on failure | error, help |
| ERR-3 Stream separation | Errors and warnings stand apart from normal output on stderr, so they aren't lost in output or piped into files | Diagnostics go to stderr and data to stdout; a failure never leaves partial data on stdout that looks like a result | Errors are mixed into stdout | error, output, help |
| ERR-4 Cause clarity | Says what was wrong | Identifies the violated precondition or invalid input | A generic message or a stack trace | error |
| ERR-5 Concept-revealing failure | The error teaches how the CLI works | The failure exposes the concept and its valid states, enough to recover autonomously | The error reveals nothing about the underlying model | error |
| ERR-6 Recovery guidance | Says how to fix it or what to run next, including "did you mean" | A valid next action can be determined, ideally as an exact command | No path forward | error |
| ERR-7 Work preservation | A mistake doesn't destroy prior work; the user can correct and re-run without starting over | A failed call leaves no ambiguous state | Failure discards input or leaves an unknown state | error, runtime |
Notes:
- ERR-4 → ERR-5 → ERR-6 form a ladder: what was wrong, which concept it involves, what to do next. Rate each on its own.
- Retry semantics and idempotency are owned by SAF-5.
- Command review documented baseline. A complete usage line directly establishes that the command publishes an invocation contract, so CLUX assesses ERR-1 as documented prevention (rating 3) even when no failure was exercised. A rating of 4 still needs an observed invalid invocation caught before side effects. ERR-2 through ERR-7 are never invented from this baseline: they need their listed evidence.
How the interaction feels as a whole, beyond getting the task done. Surface polish cannot make a
confusing or difficult command pleasant: when both dimensions are scored, Pleasantness is capped
at Ease of Use (see Scoring.md).
| Signal | Human-first — 4 looks like | Agent-first — 4 looks like | 0 looks like | Evidence |
|---|---|---|---|---|
| PLS-1 Feedback tone | Messages are calm, clear and proportionate: no scolding, no chatter | N/A | Hostile, alarming or chatty messages | output, error |
| PLS-2 Language quality | Natural wording, free of internal jargon | Precise terminology, used consistently, with low ambiguity | Jargon, typos or ambiguous wording | help, output, error |
| PLS-3 Interruptions | Prompts appear only when warranted and can be answered in advance | No prompt appears unexpectedly: none in non-interactive contexts or when every input is supplied | An unexpected prompt blocks progress (for an agent, a hang) | help, runtime |
| PLS-4 Progress | Long operations show that something is happening | Operation state can be observed or queried | Long silence with no way to tell whether it is working | output, help |
| PLS-5 Success feedback | Confirms in plain words what changed, and what to do next where useful | Success output states the outcome explicitly, including any identifiers needed for the next call | Silent or ambiguous success | output |
| PLS-6 Output readability | Scannable: aligned, grouped, sensible emphasis | N/A (owned by EFF-4) | A wall of unformatted text | output |
| PLS-7 Expectation match | Using the command feels predictable: it does what its name and help lead you to expect, so it doesn't surprise, confuse or frustrate | N/A (owned by LRN-3 and LRN-7) | It keeps doing something other than what the user expected | help, output |
Notes:
- For agents, most of what makes an interaction pleasant is already rated under Ease of Use. Only language, interruptions, progress and success feedback apply.
- PLS-7 is the lasting cost of confusion. LRN-3 rates a misleading name once, for learning. If the mismatch keeps surprising people after they know the command — they still reach for the wrong thing, or have to re-check the help — rate that here too (evidence rule 7). A command that confuses people is not pleasant to use, however polite its wording.
- PLS-7 is a design-level signal: rate it on the same basis as LRN-3, evidence or knowledge, rather than Can't verify. A name that misleads about the default behaviour keeps surprising people: rate PLS-7 2 or lower.
- Asking for help and getting an error instead is a broken expectation: rate PLS-7 1 or lower.
Mutation itself is not evidence of poor safety. Safeguards should be proportional to consequence: a read-only command needs no destructive safeguards, but it must still be safe to rely on when its output drives the next decision or command.
Applicability: a read-only command does not need destructive-action
protection, reversibility, or mutation retry safeguards, so SAF-2, SAF-4
and SAF-5 are N/A through the readOnly command fact, and so is ERR-7:
a failed call has no prior work to destroy. It still needs
to be safe to rely on: SAF-1 makes its non-mutating behaviour clear,
SAF-3 makes the queried scope clear, SAF-6 makes the result verifiable,
and SAF-7 prevents an interrupted or partial result from being mistaken
for a complete one. Read-only Safety is therefore assessed from four
relevant criteria rather than silently removed from the score.
| Signal | Human-first — 4 looks like | Agent-first — 4 looks like | 0 looks like | Evidence |
|---|---|---|---|---|
| SAF-1 Operation clarity | The user can tell whether the command reads, changes, or fetches state before acting | An agent can determine whether the command changes local or remote state before execution | Effects, including network refreshes or mutations, are unclear until after running | help, output |
| SAF-2 Destructive-action protection | Dangerous actions have proportional safeguards (confirmation, --force, typed confirmation) |
High-impact actions require explicit authorisation that can be given non-interactively (e.g. --yes) |
A destructive action runs with no safeguard | help |
| SAF-3 Selection scope | The user can tell which resources are queried and why each result matched | An agent can bound the query and identify the catalog, filters, defaults and fallback search order | Scope, source, filters or fallbacks are implicit, so a plausible-looking result can be the wrong one | help, output |
| SAF-4 Reversibility | It is clear whether and how an action can be undone | Reversibility is documented or can be determined programmatically | Irreversible, with no warning | help |
| SAF-5 Retry safety | Repeating the command doesn't cause surprising harm | Idempotency and retry behaviour are documented or evident | Re-running duplicates or corrupts | help, runtime |
| SAF-6 Safe result selection | The result contains enough identity and status information to choose the correct object before acting | A stable identifier, source, version/status and structured form make the selected object safe to pass to the next command | Display labels or aliases can be confused, stale or ambiguous, with no way to verify the chosen object | help, output, repo |
| SAF-7 Complete-result semantics | Empty, partial, stale and failed results cannot be mistaken for a complete current answer | An agent can distinguish a complete result from partial data, cache data or a failed refresh | A partial, stale or failed read can look complete and drive the next action incorrectly | help, output, runtime |
Notes:
- SAF-3 owns why a candidate appears in the result. SEC-3 owns which identity and environment the command acts as.
- SAF-6 owns whether the result can be safely selected for a later action. PLS-5 owns the success message itself.
| Signal | Human-first — 4 looks like | Agent-first — 4 looks like | 0 looks like | Evidence |
|---|---|---|---|---|
| SEC-1 Credential input | Secrets come from the environment, a file or a prompt — never a flag that lands in shell history | Secrets can be supplied without appearing in argv, logs or the agent's context | A secret is passed as a command-line flag | help |
| SEC-2 Sensitive output | Secrets and sensitive data aren't printed by default | Sensitive values are redacted in every output format, including --json and debug output |
Secrets are printed to the terminal or logs | output, help |
| SEC-3 Identity and environment context | It is clear which account, tenant and environment the command acts as | Identity, tenant and environment are explicit, or can be queried before acting | Acts on an ambient, unstated context | help, output |
| SEC-4 Least privilege | Doesn't require more permission than the task needs | Authority can be limited to the capability required | Requires broad or admin access for a narrow task | help, runtime |
| SEC-5 Authorisation clarity | Permission failures say which permission is missing | Required authority can be identified before acting, or recovered after a failure | Opaque permission errors | error, help |
| SEC-6 Boundary enforcement | The CLI prevents unauthorised operations | The agent cannot exceed its explicitly granted authority | Checks are client-side only, or absent | runtime |
Note: SEC-4 and SEC-6 usually need runtime or source evidence. Expect Can't verify from pasted help alone.
| Signal | Human-first — 4 looks like | Agent-first — 4 looks like | 0 looks like | Evidence |
|---|---|---|---|---|
| ACC-1 Color independence | Meaning isn't conveyed by color alone | N/A | Status is distinguishable only by color | output |
| ACC-2 Terminal compatibility | Readable across themes and widths; honours NO_COLOR |
N/A | Hard-coded colors, or escape codes in piped output | help, output |
| ACC-3 Text alternatives | Symbols and emoji are paired with words | N/A | Meaning exists only in symbols | output |
| ACC-4 Keyboard operation | Interactive UIs are fully keyboard-operable | N/A | Requires a pointer or unavailable keys | help, runtime |
| ACC-5 Linear readability | Output makes sense read line by line by a screen reader; meaning doesn't live in box-drawing or 2-D layout alone | N/A | Meaning depends on visual layout | output |
| ACC-6 Motion and timing | Animations can be disabled; no timed prompts | N/A | Timed prompts, or animation that can't be disabled | help, output |
Findings & certainty
What gets reported, and how sure CLUX is
Recommending fixes is the goal of every evaluation.
For every signal rated 0–2, report a finding with:
- the signal ID (e.g.
ERR-3); - the evidence — a short verbatim quote or a precise reference — and whether the finding rests on the evidence or on knowledge;
- an example whenever one makes the finding concrete: a short
terminal snippet,
$command then what the user sees; - a severity (below);
- a fix, with an after snippet showing the improved experience where possible. Make it concrete when the problem is local to the command. When the right fix depends on the wider CLI, describe the direction of improvement only. Do not invent commands or prescribe the CLI's structure from a single command.
Severity
Severity reflects consequence × likelihood for the selected audience:
| Severity | Meaning |
|---|---|
| critical | Likely data loss or secret exposure, or the command is unusable for this audience (e.g. an agent hangs on an unexpected prompt) |
| high | Frequent failure, or major friction on the main task |
| medium | Noticeable friction, or a gap on a secondary path |
| low | Polish |
Severity is independent of the rating. A 0 on SEC-1 can be critical; a 0 on PLS-6 is usually low.
A command name or verb that misrepresents the command's default behaviour is at least high: users act on the wrong prediction every time they use it, not just the first time. Certainty reflects the basis (evidence or knowledge), not the severity.
Certainty
Ratings and findings carry certainty: “92% certainty” on findings and “85% certain” on signal ratings. It is the evaluator's own estimate of how well the evidence supports the claim. Rules are different: they are passed, violated, or can't verify when the evidence does not settle them. Anything marked “from CLUX's knowledge” is clearly labelled so you can distinguish it from supplied evidence.
- 90–100%Directly shown in the evidence supplied.
- 50–89%Inferred from the evidence; plausible but not shown outright.
- 0–49%Speculative; a lead to check, not a finding.
Findings are ranked by severity, then by certainty. A critical finding at 70% certainty or more caps the grade (see Scoring). Severity also decides how firmly the fix is worded:
- CriticalRecommended fix · do this first
- HighRecommended fix
- MediumSuggested fix
- LowSuggested polish
Scoring
From ratings to the CLUX grade
CLUX applies this policy on the server after the evaluator has finished. The evaluator never sees it, so the weights can't bias its ratings. The report leads with the grade and shows each dimension as High, Medium or Low; the score below explains how the grade was reached.
From ratings to scores
- Signal points = rating × 25, giving 0, 25, 50, 75 or 100.
- N/A signals are left out. Only the rubric decides N/A (the audience columns and the command facts); an N/A from the evaluator counts as Can't verify.
- Enough to score. A facet or dimension is scored only when it has at least 2 rated signals. Otherwise it shows – and is left out of the CLUX Score, with its weight redistributed proportionally across the scored ones. Its ratings are still shown. This covers both too little evidence and a facet or dimension where fewer than 2 signals apply at all. Command review exception: Error Tolerance may score from one directly evidenced documented safeguard (ERR-1 to ERR-3). This prevents a real, command-level prevention signal from being discarded solely because recovery was not exercised; the remaining unknown signals still widen its range. Repository review retains the two-signal threshold.
- Unknowns inside a scored facet or dimension stay in. Missing
evidence is never ignored and never a pass. Each scored facet and
dimension reports three numbers over its applicable signals:
- Low — unknowns count as 0;
- High — unknowns count as 100;
- Score, the best estimate — unknowns count as 50.
- Ease of Use = the weighted mean of its scored facets, applied to the score, the low and the high separately.
- Pleasantness coherence. Pleasantness is the overall feeling of using the command, not a separate polish bonus. When both are scored, Pleasantness is capped at Ease of Use for the estimate, low and high values. A tidy table or polite wording cannot offset a confusing command.
- CLUX Score = the weighted mean of the scored dimensions, using the audience weights below, again with its low–high range. It is a weighted mean, not a plain average, so a lightly weighted dimension can't count as much as Ease of Use. The report says how many dimensions the score rests on.
- Coverage = rated signals ÷ applicable signals. The score is labelled provisional when coverage is below 50%, or when the scored dimensions carry less than 50% of the audience's weight.
- Knowledge is labelled. A rating or finding that rests on CLUX's knowledge of the command, rather than on supplied evidence, is marked in the report so the reader can distinguish its provenance.
Examples, for a Human-first command:
- Accessibility with 1 of its 6 signals rated shows –. With 2 of 6 rated 4 and 4 unknown, it scores 67, with a range of 33–100.
- Ease of Use at 54 and Accessibility at 80, with the other dimensions showing –, give a CLUX Score of (0.50 × 54 + 0.08 × 80) ÷ 0.58 = 58.
- A read-only command is assessed on SAF-1, SAF-3, SAF-6 and SAF-7: clarity that it does not mutate, query scope, result verification and partial-result safety. Mutation-only safeguards are N/A.
Signals within a facet or dimension are weighted equally. This keeps the
number of tuning knobs small and the score easy to explain. A root cause
is rated once; it lowers other signals only through separate, observable
knock-on costs (evidence rule 7 in UXHeuristics.md), so one problem
lowers several dimensions only when it really costs the user in each.
Scripting
There is no separate scripting score. Whether code can call a command reliably (machine-readable output, exit codes, stdout and stderr kept apart, a non-interactive path for every prompt) is rated in the Agent-first profile, through Efficiency (EFF-3 to EFF-5), Error Tolerance (ERR-2, ERR-3) and Pleasantness (PLS-3). Run an Agent-first review to assess a CLI for scripts and automation.
Weights
Dimensions
| Dimension | Human-first | Agent-first |
|---|---|---|
| Ease of Use | 50% | 50% |
| Safety | 18% | 24% |
| Security | 12% | 21% |
| Pleasantness | 12% | 5% |
| Accessibility | 8% | 0% |
Ease of Use facets (share of the Ease of Use score)
| Facet | Human-first | Agent-first |
|---|---|---|
| Learnability | 40% | 30% |
| Efficiency | 25% | 30% |
| Error Tolerance | 35% | 40% |
Rationale
- Ease of Use is half the score for both audiences: it is the core of whether a CLI is usable.
- Agent-first raises Safety and Security. An agent acts with delegated authority, and no human pauses before each call.
- Agent-first excludes Accessibility. Visual and assistive-technology experience belongs to the person using the terminal. Its 3% moves to Safety and Security, which govern unattended automation. Output that is safe for scripts remains assessed under Efficiency, Error Tolerance and Safety rather than being relabelled as Accessibility.
- Humans are stopped first by learning, so Learnability leads the Human-first facets.
- Agents re-read help on every call, so repeated-call cost (Efficiency) matters as much as learning. Recovering from failure without a human (Error Tolerance) is how agents finish tasks.
These are starting values. Change them only against the benchmark set (below), never on argument alone. Every change is a new rubric version.
Critical findings cap the grade
A weighted mean lets strengths hide a critical failure. A command that prints an API token could otherwise still earn a B.
If any finding is critical with confidence ≥ 70, the grade is capped
at D, whatever the score. The score is still shown unchanged, together
with the finding that capped it.
Grade bands
The grade follows the score (the best estimate).
| Grade | Score | Label |
|---|---|---|
| A | 90–100 | Excellent |
| B | 75–89 | Good |
| C | 60–74 | Usable, fixes needed |
| D | 40–59 | Painful |
| F | 0–39 | Do not ship |
How results are reported
The grade is the result. It leads the report, with its label (for example "D · Painful"). The number behind it is shown smaller, with its range: it explains the grade, but a few points of difference between two evaluations of the same command are noise, not a different result.
Each dimension, and each Ease of Use facet, is reported as a level, on the same cut-offs as the grade bands:
| Level | Score | Grades |
|---|---|---|
| High | 75–100 | A, B |
| Medium | 60–74 | C |
| Low | 0–59 | D, F |
A dimension with too little evidence shows –.
Security is not graded in a Command review. Whether a CLI is secure depends on how the whole tool handles credentials, permissions and trust boundaries: how tokens move between commands, what each command is allowed to do, and whether boundaries hold across workflows. One command can't show that. So a Command review leaves Security out of the grade, out of coverage and out of its fixes, shares its weight across the graded dimensions, and explains instead what Security covers and how Repository review assesses it across every command. One exception keeps the grade honest: a critical exposure the evidence shows outright, such as a token passed in a flag, is still reported and still caps the grade (see Critical findings cap the grade). Repository review grades Security in full.
Two evaluations of the same command agree when they give the same grade and name the same top problems. That, not an identical number, is what CLUX is held to.
Ease of Use trade-off
When Learnability and Efficiency each have at least one rated signal and their scores differ by 25 points or more, the report flags the trade-off:
- Learnability higher → "Easy to learn, slow for experts." Recommend an expert path (EFF-3).
- Efficiency higher → "Fast for experts, hard to learn." Recommend a guided path or better progressive disclosure (LRN-8).
The flag is advice, not a penalty. The score is unchanged.
What does not affect the score
- Rule results. Rules are optional and a separate analysis.
Versioning
Every evaluation result records the rubric version it used.
Same input, same report. A request with the same evidence, audience, rules, rubric, evaluator prompt and model returns the stored report instead of a new evaluation, so repeating a run can't change its score. What is stored is the evaluator's ratings: the score is recomputed from them, so a fix to the scoring applies to stored evaluations too. Any change to the rubric or prompt starts fresh.
| Change | Version bump |
|---|---|
| Wording that should not change any rating | Patch |
| Clarified anchors or notes; ratings may shift slightly | Minor |
| Signals added, removed or moved; weights, caps or thresholds changed | Major |
Scores from different major versions are not comparable. CI baselines compare results only within the same major version.
Worked example (Human-first)
Computed by the same code that scores real evaluations. Inside each scored dimension, unchecked signals count as 50 and widen the range. Accessibility has no rated signals here, so it shows – and its 8% weight is shared across the scored dimensions.
| Dimension | Score | Range | × Weight | = Points | Checked |
|---|---|---|---|---|---|
| Ease of Use | 48 | 31–64 | 54% | 25.8 | 14/21 |
| ↳ Learnability | 59 | 47–72 | 40% of EoU | 6/8 | |
| ↳ Efficiency | 50 | 33–67 | 25% of EoU | 4/6 | |
| ↳ Error Tolerance | 32 | 11–54 | 35% of EoU | 4/7 | |
| Pleasantness | 48 | 31–64 | 13% | 6.2 | 4/7 |
| Safety | 36 | 14–57 | 20% | 7.0 | 4/7 |
| Security | 46 | 13–79 | 13% | 6.0 | 2/6 |
| Accessibility | not scored | — | — | — | 0/6 |
| CLUX Score (rounded) | 45 | 25–65 | |||
Agent cost
The Token Footprint
Measured beside the grade and never part of it. CLUX counts it in code from the transcript, with no model, so the same evidence always gives the same numbers.
CLUX Agent Cost
Cost spec version: 0.2.0 (draft, for the owner's review)
Changes from 0.1.0 (2026-10-08, from an outside review): the footprint says
what it measures and what it doesn't; every number is observed or labelled
an illustration; bounded output has four states; the session estimate is a
labelled illustration, never the headline; prices carry a date and a source;
a "Footprint opportunities" list turns the measures into action; the full
panel is shown to the Agent-first audience only; the build notes moved to
docs/agent-cost-notes.md.
This file defines the Token Footprint: what a command's output costs an AI agent to read, measured from the evidence, not judged. It sits beside the CLUX Score and never changes it (Scoring.md, "What is reported, not scored"). Every number here is deterministic: the same transcript gives the same numbers every time, with no model involved.
It counts what the command printed. It doesn't count the agent's own prompt and tool definitions, its reasoning and replies, retries, caching, or how a tool host trims output before the model sees it. Those belong to the task benchmark (see "Free and paid"), which measures an agent completing real tasks end to end.
Why it exists
Every token a command prints costs an agent twice: once in money (input tokens) and once in time (the model reading them), on every call, for every agent that uses the tool. A command that prints 4,000 tokens where 200 would do is slow and expensive forever. The UX score says whether a command is pleasant for an agent; the footprint says what its output costs, and the opportunities list says where that cost could drop.
Who sees it
The footprint is about agents, so the Agent-first report shows the full panel: the measures, the opportunities and the contract taster (AgentContract.md, "The free taster").
The Human-first report shows one line under the score, no panel: the observed call footprint in tokens and a link to the Agent-first view. A Human-first report is about a person at a terminal; the maintainer reading it should learn that the footprint exists without the report changing subject.
The methodology page documents the footprint once, for both audiences.
What it is measured from
The evidence transcript, split into runs at each $ line (the same split
the evidence rules use), with CLUX's fetched documentation set aside.
Runs are classed as:
- help: the command was run with
--help,-horhelp; or, when the pasted text has no$line at all, the text starts withUsage:or has anOptions:heading. A help run inferred this way is reported as "run type inferred from the text". - error: an invalid invocation (an unknown flag or subcommand), or output
whose first non-empty line starts with a failure marker (
error:,Error:,fatal:, orusage:after a rejected call), or a recorded non-zero exit code when the evidence carries one. A word like "error" anywhere else in the output never makes a run an error: "0 errors" is a success. - output: any other run that printed something.
Pasted text with no $ line that doesn't look like help is one
unclassified run: its tokens are reported, but nothing else can be
concluded from it.
A number needs its run. Where the evidence has no run of that kind, the measure is not measured, never guessed, and the report says which run would settle it.
A run that was cut short (the evidence says "… truncated at N characters") counts as at least its printed size, shown as "≥ N tokens". Nothing derived from it (a median, a cost, the 100-call illustration) is shown as an exact figure: it's shown as a lower bound, or not at all.
Counting
| Unit | Rule |
|---|---|
| Tokens | Counted with the reference tokenizer, o200k_base, offline and open, so the count is reproducible by anyone. Other models count tokens differently, and by how much depends on the text; prices on other models use this count as an approximation, and the report says so. |
| Characters and lines | Shown beside tokens because they're the same for every model. |
| Cost | tokens ÷ 1,000,000 × the model's input price per million tokens. All output a command prints is input to the model. |
Reference tokenizer and prices live in this file, so changing them is a rubric decision, not a code change.
Price references
Prices as of 2026-10-08, standard (uncached) input, US dollars before
tax, from the Vercel AI Gateway model list (ai-gateway.vercel.sh/v1/models)
and the providers' own price pages. Refreshed monthly; the table is curated
(the models agents actually run), not every model that exists.
| Model | Input $/MTok | Shown in |
|---|---|---|
claude-sonnet-5 (reference) |
2.00 | Free and paid |
claude-opus-5-5 |
4.00 | Paid |
claude-haiku-4-5 |
1.00 | Paid |
claude-fable-5-1 |
10.00 | Paid |
gpt-5.5 |
5.00 | Paid |
gemini-3.5-flash |
1.50 | Paid |
mistral-large-4 |
0.68 | Paid |
The free report prices on the reference model only. Paid tiers show every model in this table, so a team can see the cost on the model its agents actually use.
A report keeps the prices it was made with. A later "reprice at today's rates" view is labelled as such and never replaces the stored figures.
The measures
| Measure | What it answers | How it's computed | Needs |
|---|---|---|---|
| Help footprint | What does it cost an agent to learn this command? | Tokens, characters and lines of the help run. Subcommand count: lines listed under a Commands: heading. |
help run |
| Observed call footprint | What did the observed calls cost? | Each output run's tokens, listed with its command. When two or more runs are the same command and subcommand, their median and the number of runs. Runs of different commands are never combined, and a structured-output run is compared in "Plain vs structured", not averaged in here. | output run |
| Error footprint | What does a failure cost? | Tokens of the error run, and whether it points to a fix: the text contains a usage line, a --help pointer, "did you mean", or "try …". |
error run |
| Formatting overhead | How much of the output is layout? | The share of output tokens taken by ANSI escape codes, lines made only of box-drawing, -, =, +, ` |
` and spaces, and blank lines. Layout can help a reader, so this is a cost, not a fault. |
| Plain vs structured | What does the structured flag change? | The help documents a structured-output flag (--json, -o json, --output json, --format json, --porcelain). Measured only when the evidence has the same command with the same arguments once plain and once with that flag: shown as a token difference either way (+ or −). Structured output can be larger and still worth it, because an agent parses it reliably. Otherwise documented, not measured. |
help; the matching pair for a measured difference |
| Bounded output | Can this command flood the context window? | One of four states, below. "Bounded" alone is never shown. | help and runs |
| Speed | How long does the command itself take? | Wall-clock per run, when the transcript records it (npm run capture records it; a user can paste a timed run). Reported per run kind. |
timing in the evidence |
| 100-call illustration | What would 100 calls like these cost? | (help + 100 × observed call) × reference price. Always labelled as an illustration with its assumptions, never called "per session". It may be the panel's headline, labelled as an estimate, with the measured tokens it rests on shown directly beneath it. It assumes no failures; retries are measured by the task benchmark, not invented here. |
help and output runs |
Bounded output states
| State | Meaning | Evidence |
|---|---|---|
| Limiter documented | The help lists a result-limiting flag: --limit, --max-count, --max-results, --max-items, --tail, -n <num>, --page, --per-page. Flags that limit something else don't count (--head names a branch in gh; --max-time limits time). |
help run |
| Limiter verified | A run used that flag and printed less than a run of the same command without it. | two output runs |
| Large output observed | A run printed more than 2,000 tokens with no limiter used. | any run |
| Not assessed | None of the above. |
The contract taster's AGC-19 (AgentContract.md) uses these same states, so the panel and the taster never disagree about the same runs.
Each measure is shown with the rule that produced it and the run it came from, so a reader can check it against the transcript.
Footprint opportunities
Beside the measures, the report lists what would lower the footprint, each tied to the run that shows it and worded as the next step, not a verdict. The list is empty when the evidence shows nothing to lower. Examples:
- Verify a limiter on the call that printed 9,000 tokens.
- Capture plain and structured output of the same call to measure the difference.
- Trim the default fields: 40% of the output is layout.
- Add a recovery hint to the error that has none; a failure that doesn't point to a fix costs a retry.
- Record a timed run to measure speed.
These never change the grade or the ranked UX fixes. They are how a measurement becomes a reason to spend engineering time.
What it must never do
- Change the CLUX Score, the grade, coverage or the ranked fixes.
- Guess a number the evidence can't support.
- Show an illustration as an observation.
- Show an exact figure that rests on a run that was cut short.
- Price on a model the file doesn't list.
Free and paid
| Free | Pro | Team | |
|---|---|---|---|
| Footprint of one command, reference-model cost, 100-call illustration, opportunities | ✓ | ✓ | ✓ |
| Prices on every model in the table | ✓ | ✓ | |
| Whole-CLI totals and the most expensive commands | ✓ | ✓ | |
| Cost per successful task: an agent runs pinned tasks in a sandbox; tokens, retries, time and spend, counted end to end | ✓ | ✓ | |
| Cost trend across releases, on every pull request, compared only on the same tasks, fixtures, model and prices | ✓ |
Decisions taken in 0.2.0
- 2,000 tokens stays the "large output" line until real captures say otherwise.
- No error rate in the 100-call illustration: an invented failure rate makes an invented number more invented.
- The price table holds the models agents actually run, refreshed monthly, with its date and source above it.
- Pasted help without a
$line counts as help when it looks like help, and the report says the type was inferred. - The Human-first report shows one line, the Agent-first report the panel.
- The estimated cost leads the Agent-first panel (owner, 2026-10-09): the price sells the footprint, and the measured tokens beneath it keep it honest.
Worked example: tar --help
Computed by the same code that measures real reports, from CLUX's capture of tar --help (bsdtar 3.5.3 - libarchive 3.5.3 zlib/1.2.12 liblzma/5.4.3 bz2lib/1.0.8). Run 1 is the help run (368 tokens); Run 2 is the error run (16 tokens). Where the capture has no run of a kind, the measure says which run would settle it.
| Measure | Result, run and rule |
|---|---|
| Help | 368 tokens · 1,135 characters · 24 lines Run 1 · tar --help RuleHelp footprint: tokens, characters and lines of the help run. Subcommands are the lines listed under a Commands: heading. |
| Observed calls | Not measured To settle it: Paste a real run of the command that prints its usual output, starting with its RuleObserved call footprint: each output run's tokens, listed with its command. When two or more runs are the same command and subcommand, their median and the number of runs. Runs of different commands are never combined, and a structured-output run is compared in Plain vs structured, not counted here. |
| One error | 16 tokens · 66 characters · 1 line Doesn't point to a fix Run 2 · tar -tf /nonexistent-clux.tar RuleError footprint: tokens of the error run. It points to a fix when it has a usage line, a --help pointer, "did you mean" or "try …". |
| Formatting overhead | Not measured To settle it: Paste a real run of the command that prints its usual output, starting with its RuleFormatting overhead: the share of output tokens taken by ANSI escape codes, lines made only of box-drawing, -, =, +, | and spaces, and blank lines (1 − content tokens ÷ total tokens). Layout can help a reader, so this is a cost, not a fault. A run the capture cut short is left out. |
| Plain vs structured | No structured-output flag in the help Run 1 · tar --help RulePlain vs structured: the help documents a structured-output flag. Measured only when the evidence has the same command with the same arguments once plain and once with that flag, as a token difference (structured − plain, + or −). Structured output can be larger and still worth it, because an agent parses it reliably. |
| Bounded output | Not assessed Runs 1, 2 To settle it: Paste a real run of the call likely to print the most, such as a listing over a large input, or the same call with and without a limiting flag. RuleBounded output, one of four states. Limiter documented: the help lists a result-limiting flag (--limit, --max-count, --max-results, --max-items, --tail, -n <num>, --page, --per-page). Limiter verified: a run used that flag and printed less than a run of the same command without it. Large output observed: a run printed more than 2,000 tokens with no limiter used. Not assessed: none of the above. |
| Speed | Not measured To settle it: Capture it with RuleSpeed: wall-clock time per run, reported per run kind, when the transcript or CLUX's capture records it. |
Rules
Optional: the UNIX philosophy, or your own rules
Why rules are separate
Rules are choices, not measures of experience. A team may deliberately depart from a common convention, and that is a policy decision rather than a UX flaw. That is also why no ruleset is checked unless the user asks for one: being more UNIX-like does not by itself make a command easier to use.
The same evidence can appear in both analyses. For example, error messages printed to stdout:
- violate
UNIX-09 Errors to stderrhere — does it follow the rule? - lower Error Tolerance in the UX heuristics — does it hurt the user?
This is intended. Each analysis explains the problem from its own perspective, and only the UX heuristics produce a score, so nothing is counted twice.
Which rules are checked
The user chooses one of:
- None (the default). No rules are checked and the report has no rules section.
- UNIX philosophy. CLUX checks the rules below that apply to one command. Rules that require an inventory of the whole CLI are reserved for a whole-tool review.
- Your rules. The user's own ruleset, such as a team style guide.
Results
Each rule returns exactly one result:
| Result | Meaning |
|---|---|
| Violated | The evidence shows the command breaking the rule. Quote it. |
| Passed | The evidence positively shows the rule is followed. |
| Can't verify | The evidence needed was not supplied. Rules that compare commands are reserved for a whole-tool review rather than included here. |
The evidence rules in UXHeuristics.md apply. Design-level rules
(naming, verb meaning, what the command is for) may be judged from
CLUX's knowledge of a well-known command; say so in the explanation.
Rules about exact output, exit codes or error wording need supplied
evidence. Missing evidence is never a silent pass.
Fixes
For every violation, state the smallest change that brings the command into conformance — for example, "Send error messages to stderr."
If that fix would conflict with a UX heuristic, say so. The conflict is useful information for the team deciding whether to keep the rule.
The UNIX philosophy ruleset
UNIX-01Composability & pipes
Accepts stdin and writes clean stdout so it composes with pipes.
UNIX-02Do one thing well
Avoids feature bloat and combining unrelated operations.
UNIX-03Everything is a file
Treats file paths and stdin/stdout interchangeably where applicable.
UNIX-04Silence is golden
Produces no output on success unless asked; no banners or chatter.
UNIX-05Rule of clarity
Command name and flags clearly describe what happens.
UNIX-06Rule of transparency
Side effects are predictable and observable (e.g. --dry-run, --verbose).
UNIX-07Rule of diversity
Human text by default, a machine format (e.g. --json) for scripting.
UNIX-08Meaningful exit codes
Exit 0 on success, non-zero on failure; codes are consistent and documented.
UNIX-09Errors to stderr
Errors, warnings and diagnostics go to stderr, never stdout.
UNIX-10--help / -h everywherewhole CLI
Every command and subcommand responds to --help or -h with usage. *(Whole-CLI rule; reserved for a tool review.)*
UNIX-11Respect NO_COLOR
Honours NO_COLOR and offers --no-color; never forces color in pipelines.
UNIX-12Secrets not in flags
Credentials come from env vars, files or prompts — never command-line flags.
Limits
What CLUX won't claim
- A CLUX Score is a summary, not a release decision. Use it to find problems, and let people decide what ships.
- Reports cover one command at a time. Rules that compare commands are “can't verify” unless more than one command is supplied.
- Whether each command has one clear purpose, with no overlap between commands, can only be judged across the whole CLI. That check is part of repository analysis, not this report.
- Ratings and findings marked “from CLUX's knowledge” come from the model's knowledge of a well-known command, not from your evidence. Check them against the real command.
- AI evaluations can be wrong. Each rating quotes its evidence so you can check it, and certainty is an estimate, not a guarantee.
- A score's range shows only what unchecked signals could do. It says nothing about signals CLUX rated wrongly.
- Scores from different major rubric versions aren't comparable.