plugins/src/base/skills/lisa-qa-fail/SKILL.md
QA failure front door. Takes a human tester's plain-language failure description, finds the right ticket (the served ticket, or the original via duplicate-discovery when the report arrives untied), writes the structured failure report (repro / expected vs. actual / which acceptance criterion failed), diagnoses the EXPECTATION GAP — why the implementing agent's done-evidence said done when QA says it isn't — applies the qa-fail label that makes lisa-rework-triage detection deterministic, and transitions the ticket back to the build-ready status. QA never words a ticket again; agents never guess what QA meant.
npx skillsauth add codyswanngt/lisa lisa-qa-failInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
Convert a human failure observation into the exact artifact the fixing agent needs. Two inputs arrive together or the report cannot be filed: a target ticket and the tester's verbatim description (what they did, what they expected, what happened, plus any screenshots).
lisa-qa-queue with a key): use it.lisa-tracker-write): search open and
recently-closed tickets in the affected area, and the current QA-queue set. If an existing ticket
covers it, that ticket is the target — update it, never file a twin. Only when the
search documents no match, create a new Bug via lisa-tracker-write (which enforces
the full quality gates) and treat it as the target. Report which path was taken.Fetch the bundle via lisa-tracker-read. Post one comment:
[lisa-qa-fail] QA failure — <one-line summary>
Reported by: <tester> on <date>, against <environment>
Steps to reproduce: <numbered, from the tester's words>
Expected: <what the ticket/AC promised, quoted or paraphrased faithfully>
Actual: <what the tester observed, verbatim where possible>
Failed acceptance criterion: <AC number/text from the ticket — or "not covered by any AC" (see gap)>
Attachments: <screenshots if provided>
Preserve the tester's language in Actual — their words are the evidence; your job is
structure, not rewording.
Answer explicitly: why did the implementing agent believe this was done? Locate the
prior cycle's done-evidence — the build-evidence comment (lisa-tracker-evidence output),
the merged PR's verification section, and any codified regression test — and compare it
against the failure. Classify the gap (exactly one):
| Gap | Meaning |
|-----|---------|
| ac-mismatch | The evidence verified a different reading of the AC than QA's — the criterion is ambiguous or the ticket distorted it. |
| verification-weakness | The evidence never actually exercised the failing path (asserted adjacent behavior, mocked the surface, or skipped the step). |
| environment-difference | Verified where it works (e.g. dev) but fails on the QA environment — config, data, or deployment drift. |
| data-difference | Behavior depends on data present in one environment and absent in the other. |
| regression-since-merge | The evidence was genuinely valid when produced; later merges broke it. |
| not-covered-by-ac | QA's expectation is real but no AC promises it — a spec gap, not an implementation failure. |
Append to the same comment:
Expectation gap: <classification>
Why the agent thought it was done: <2-3 lines citing the specific evidence artifact>
If no done-evidence exists at all, say so — Expectation gap: no-evidence-found is
itself a serious finding (the verification lifecycle was skipped) and must be surfaced,
not smoothed over.
For not-covered-by-ac, do NOT transition the ticket — the spec question goes to the
human product gate. Flag it in the response and stop after posting.
qa-fail label — this is the deterministic rework signal lisa-rework-triage
keys on at next claim, and the gap classification above becomes its primary evidence.jira.workflow.ready, or the
configured tracker's equivalent ready label/state when tracker is GitHub or
Linear). The rework loop takes it from here: intake claims it, lisa-ticket-triage Phase 2.5 runs
lisa-rework-triage, and the fix proceeds with full context.[lisa-qa-fail] comment per failure event — if the same tester reports the same
failure again before a fix ships, add a short "seen again <date>" line to the existing
comment instead of a new block.no-evidence-found —
a gap classification without a citation is a guess, and guesses are worse than
no-evidence-found.development
Prepare a machine — a fresh laptop or a throwaway container — to run coding agents, before any repository exists. Detects which of Lisa's supported agents (Claude Code, Codex, Cursor, OpenCode, Antigravity, Copilot) are already installed, asks which credential manager the machine uses (Bitwarden, 1Password, Doppler, Vault, AWS, or none), and installs only what is missing, each by its vendor's own preferred method. Idempotent, headless by default, and emits a Dockerfile for a spin-up/spin-down environment. Run it on a new machine, in a container, or before cloning anything.
tools
Provision and verify a remote execution environment for a host project — Codex Cloud today, other remote surfaces as they are added. Generates a repository-owned setup script that installs the declared toolchain, materializes secrets through lisa-secrets-access, and runs the project's own hook. Provisions by API where one exists, by driving the vendor console where one does not, and by emitting exact config otherwise — then proves the result with the same read-back regardless of which tier did the work. Use before dispatching any work with executionEnv.
tools
Bring a developer's machine in line with the toolchain the project declares. Reports every tool in remoteEnv.tools that is missing, outdated, or unpinned for this platform, and installs the missing ones into ~/.local/bin from the same pinned, checksummed entries the remote surfaces use — but only when asked. Same manifest, same pins, same installers as lisa-setup-remote-env; what differs is consent and that the pin is a floor rather than an equality. Run it on a fresh checkout, after a manifest change, or when a tool fails at the moment of use.
tools
Route one unit of work to a remote execution surface. Reads the executionEnv parameter (local by default, codex-cloud or claude-web today), verifies the environment is provisioned and bound to this repository, submits a thin skill invocation, records the task identifier to .lisa/remote-dispatch.json, and exits without polling. Routing only — the remote runs the identical skill from the identical repository. Composable and inline: other skills invoke it via the Skill tool rather than users calling it directly.