Run an already-clear UAT block FOR the operator — execute each step, capture the real output, and auto-judge only the mechanically-checkable ones (exit code, output match, refusal text, DB/HTTP/file/log); escalate every judgment call with evidence. Removes the run-command → paste-output → relay loop. With --ui, also drives + vision-judges the visual-tier steps via /judge-ui instead of escalating them. Use when the operator has a concrete UAT/manual-smoke block (a plan M-step, a "commands + wh...
Scanned 9/3/2026
Install to Claude Code
npx -y skills add aberson/skill-mesh --skill user-uat --agent claude-codeInstalls into .claude/skills of the current project.
Are you the author of User Uat?
Add the live security badge to your README — it updates automatically with every re-scan.
[](https://www.skillsdirectory.com/skills/aberson-user-uat)More formats (shields.io, HTML) on the badges page.
---
name: user-uat
description: Run an already-clear UAT block FOR the operator — execute each step, capture the real output, and auto-judge only the mechanically-checkable ones (exit code, output match, refusal text, DB/HTTP/file/log); escalate every judgment call with evidence. Removes the run-command → paste-output → relay loop. With --ui, also drives + vision-judges the visual-tier steps via /judge-ui instead of escalating them. Use when the operator has a concrete UAT/manual-smoke block (a plan M-step, a "commands + what to look for" table, or ad-hoc "run these, expect these") and wants the mechanical tier done for them. Invoke as "/user-uat [source] [--deep] [--ui] [--dry-run] [--yes-side-effects]".
user-invocable: true
---
# User UAT
> **Judging doctrine:** the mechanical-gates-first, evidence-on-every-verdict, and low-confidence-escalates invariants behind this skill's partition live in [`_shared/judge-core.md`](../_shared/judge-core.md) — this skill instantiates them for the UAT-execution case.
Execute an **already-clear** UAT block so the operator doesn't have to be the mechanical
relay (run command → eyeball output → paste it back). The skill runs each step, captures
the real result, and **auto-judges only the deterministically-checkable steps**; everything
that needs judgment is escalated with the evidence attached.
It does **two things deliberately NOT**: it does not *refine* a fuzzy script (that is
`/review-uat`), and it does not *replace the operator* for checks that genuinely need a
human. The win is the mechanical tier — which is most of the volume.
## When to use / not
- **Use:** a concrete UAT exists — a `Type: operator` plan M-step, a build-phase "Manual UAT"
bundle, the "commands + what to look for" table from a handoff, or the operator pasting
"run these and tell me what happens." Steps have commands and observable expectations.
- **Don't use** to write or refine a UAT. If steps are ambiguous (verb with no object, "expect
X" with no observable, no pass criteria), **STOP and delegate to `/review-uat`** — do not
guess what a step means. A run built on a guessed expectation is worse than no run.
## Invocation
```text
/user-uat # use the UAT block from the current conversation
/user-uat path/to/plan.md#M4 # run the M-step at this anchor
/user-uat --dry-run # classify + print what WOULD run (mechanical / side-effectful / escalated); run nothing
/user-uat --deep # also agent-JUDGE the judgment-class checks; each flagged 'agent-judged: <verdict> — confirm?'
/user-uat --ui # drive + vision-JUDGE the visual-tier steps via /judge-ui instead of escalating them to you
/user-uat --yes-side-effects # auto-run side-effectful steps too (trusted flow); default gates them
```
## The partition (the load-bearing rule)
Operator UAT exists to catch what agent self-checks miss (agents grading agent-written work
codify regressions — toybox G2; the audit-wire-shape rule). So **never auto-PASS a check that
isn't deterministic.** Classify every step's *action* and *verify* (separately) into:
| Tier | The verify is… | Default behavior |
|---|---|---|
| **Mechanical** | exit code, "stdout contains X", "refuses with Y", a DB row / count, HTTP status, file on disk, a log line | **Auto-judge** PASS/FAIL — show the observed value as evidence |
| **Agent-judgeable** | "output looks grounded", "the ship-vs-park call was right", a diff reads sensibly | **Escalate** with evidence (default). With `--deep`: agent assesses too, labeled `agent-judged: <verdict> — confirm?` |
| **Visual** *(needs `--ui`)* | a **rendered screen state** visible in one browser frame — layout, a component, copy, a list/table, "the right screen showed" | **Without `--ui`: escalate (Human).** With `--ui`: drive + vision-judge via `/judge-ui` — read-back-cross-checked; `UNCERTAIN → escalate`, never auto-PASS |
| **Human** | **animation / motion**, audio / sfx, real-device input, kid-facing feel, anything credentialed or physical the agent can't drive | **Always escalate** — a crisp one-line ask, never a verdict |
**When classification is ambiguous, treat the verify as human and escalate.** A
mechanical-judgement applied to a judgment-class check is exactly how the blind spot leaks
back in. **Even with `--ui`, motion / audio / feel stay Human** — a screenshot is one frame; it
can't see a countdown tick or hear a sound.
## Flow
1. **Ground + classify (no guessing).** For each step emit a classification line:
`Step N (source: file:line / M-anchor) — action: <command>; verify: <expectation>; Tier: Mechanical / Agent-judgeable / Human`
The source citation must appear on the per-step classification line, not just in a header.
Valid tiers are **Mechanical**, **Agent-judgeable**, **Human** — plus, only when `--ui` is
passed, **Visual** (a vision-judgeable subset carved out of Human: a rendered screen state, not
motion/audio/feel). There is no "Ungroundable" category. If a step can't be grounded or is
ambiguous → stop, report it, and point at `/review-uat`.
2. **Safety gate.** Tag each command read-only/preview vs **side-effectful** (mutates state,
is outward-facing, or is hard to reverse — e.g. a real `goblin do` that auto-ships into a
sibling repo, a deploy, an external send, a DB write/drop, a `git push`, starting a process
that writes or sends anything). Auto-run the safe ones; **pause and confirm before each
side-effectful one** (unless `--yes-side-effects`). **Never rationalize a side-effectful step
as "probably read-only" to skip the confirmation gate.** If reversibility / outward-facing-ness
is unclear, treat it as side-effectful and confirm (fail safe). Prefer the step's own
`--dry-run`/preview when it has one.
3. **Run the auto-tier.** For each step, run its *action* (subject to the step-2 side-effect
gate — the action may be agent-run, or a human/side-effectful one you've confirmed), capture
stdout/stderr + exit code, then **auto-judge only the mechanical-tier verify** against its
concrete expectation. Show the **actual observed value** inline — data, not editorializing. A
mechanical **FAIL stops the run** (don't barrel past a failure into dependent steps), then
still emit the step-5 report for the steps that ran + which step failed (observed-vs-expected).
**Long-running actions** (a server start, a watcher): run them in the **background**, then poll
a **readiness probe** (health endpoint, listening port, or an expected log line) before running
any dependent verify — never block the run on a foreground server. A probe that never comes up
within its budget is a mechanical **AUTO-FAIL** with the captured log tail as evidence, and
stops the run like any other mechanical FAIL.
4. **Judgment tier.** For agent-judgeable / human steps: present the captured evidence + the
expectation and **escalate** (default). With `--deep`, also give the agent's assessment for
the agent-judgeable ones — flagged `agent-judged: <verdict> — confirm?`, with any uncertainty named.
Human-tier steps always escalate regardless of `--deep`.
**Visual-tier steps:** without `--ui`, escalate like Human. With `--ui`, delegate to
`/judge-ui` — it drives the screen, captures stage screenshots, and renders a vision verdict
**cross-checked against an API/DB read-back**; a corroborated PASS lands in the step-5 report
with its evidence (screenshot + read-back value), and an `UNCERTAIN`/low-confidence/pixels-vs-
read-back-disagree result falls back to the **`Needs you`** section. Use the project adapter for
bring-up + auth (e.g. toybox `/uat-ui`); never drive an app instance you don't own.
5. **Report (terse).** One line per step — **plain text, not a markdown table**:
`step → AUTO-PASS / AUTO-FAIL / ESCALATED → one-line evidence`
Example: `M4 row 1 → AUTO-PASS → exit 0, stdout contains "shipped"`
Then a **"Needs you"** section (use that exact heading) listing each escalated item as a
**terse single-sentence ask** — no captured output blocks, no interpretive framing. End by
naming what's left (e.g. "Please eyeball M4 row 3 and M4 row 5; the rest passed").
## Safety + discipline
- **Never auto-PASS a non-mechanical check.** Mechanical = auto; agent-judgeable = escalate
(or `--deep` + label); human = always escalate.
- **Gate side effects.** Read-only/dry-run/preview auto-run; destructive or outward-facing
steps confirm first. `--yes-side-effects` only for a flow the operator has declared trusted.
- **Delegate, don't guess.** Fuzzy/ungroundable script → `/review-uat`, not a guessed run.
- **Push back on state mismatch.** If the operator (or `--deep`) calls something PASS but the
mechanical check disagrees, surface the discrepancy verbatim (`observed X, expected Y`) plus
ONE disambiguating question — don't rubber-stamp (per `feedback_uat_pushback_on_state_mismatch`).
- **Show the data.** Every verdict cites the observed value; a verdict with no evidence is a
defect.
- **`--ui`: never drive an app instance you don't own.** A vision flow that logs in with a UAT
PIN against the operator's real (or a parallel session's) app can lock out their account. Use
the project adapter's isolated bring-up, and check port ownership before driving.
## Relationship to other skills
- **`/review-uat`** — the refinement partner. It tightens a fuzzy UAT, and its `--exec` delegates
execution of the refined script HERE — `user-uat` is `/review-uat --exec`'s execution target, as
well as the terse *run-an-already-clear-one* path that hands fuzzy input back to it. Refine with
review-uat, then run with user-uat.
- **`/judge-ui`** — the visual-tier executor `--ui` delegates to: drives a browser flow,
captures stage screenshots, and renders a vision verdict cross-checked against a read-back
(`UNCERTAIN → Human` fallback). Project adapters (e.g. toybox `/uat-ui`) supply its bring-up +
auth. Pairs with `--deep` the way `judge-ui` pairs with this skill's Human-fallback.
- **`/verify`** — runs the app to confirm a code change works; `user-uat` runs a *defined UAT
script*, partitioning auto-vs-human across its steps.
- **`/build-phase`, `/build-step`** — their `Type: operator` / "Manual UAT" outputs are exactly
the blocks `user-uat` is built to execute.
- **`/user-walkthrough`, `/user-shakedown`** — the two operator-acceptance siblings for a
just-built feature with no clear script yet. `/user-uat` EXECUTES an already-clear script;
`/user-walkthrough` is operator-DRIVEN exploration (you drive, the agent answers from source /
fixes small / logs big); `/user-shakedown` AUTONOMOUSLY CLOSES the resulting UAT ledger to zero
open items. Poke a fresh build with a walkthrough/shakedown; run a defined block with user-uat.
Is this your skill, or is something wrong with this listing? Request removal or report an issue. Author removals are honored within 72 hours.
No comments yet. Be the first to comment!