plugins/lisa/skills/use-the-product/SKILL.md
Shared methodology for actually USING a project's product the way its real end user would — across product types (DOM web app, HTTP/API backend, canvas game, CLI/library, IaC/CDK). Detects the product's consumer-facing interface, drives it as that consumer, gated by a per-environment mutation policy read from .lisa.config.json (so the agent never mutates production data by accident), and lensed through the project's personas/subagents when it defines them. Invoked by exploratory-qa (files defect/UX tickets) and product-walkthrough (grounds planning in the live product); rarely run standalone.
npx skillsauth add codyswanngt/lisa use-the-productInstall 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.
Every product has a consumer-facing interface. To evaluate a product you (1) detect that interface, (2) resolve where you're allowed to drive it and how much you may change, and (3) drive it as the real consumer would — through the project's personas when it has them. This skill owns steps 1–4 below; the caller decides what to do with what you find (exploratory-qa files tickets, product-walkthrough grounds planning).
Driving the product means interacting with it. Static route scans, HTTP fetches, screenshots-alone, and reading the code are supporting evidence only — never a substitute for actually using it.
Infer from the repo; if genuinely ambiguous, ask one concise question.
| Signals | Type | Consumer-facing interface |
|---|---|---|
| vite/next/angular/svelte + index.html, DOM UI | DOM web app | the rendered UI in a real browser |
| API server (nest/express/fastify/serverless handlers), OpenAPI, no frontend | HTTP / API backend | the API endpoints |
| phaser/pixi/canvas game | Canvas game | the canvas + input (keyboard/pointer), read visually |
| cdk.json / Terraform / IaC | IaC / CDK | the resources it provisions (+ synth output) |
| bin/ CLI or published library, no server | CLI / library | the commands / public API |
Read the exploration block from .lisa.config.json (a repo-local config overrides a global one):
"exploration": {
"default": "<env-name>", // which env to use when none is passed
"environments": {
"<name>": {
"url": "https://dev.example.io", // web/API target (omit for local CLI/game)
"provision": true, // IaC/ephemeral: stand up, then tear down
"mutation": "forbidden | read-only | full",
"identity": "<test-account ref>", // which login to use (env var / 1Password ref)
"prodMutationAck": "<one sentence>" // REQUIRED to allow `full` on a production-named env
}
}
}
Resolve the target env: explicit argument → default → infer. Then the mutation level governs everything:
read-only — only non-mutating interactions: read endpoints (GET), view UI without submitting, cdk synth/diff, --help/dry-run. Never create / edit / delete.full — create / edit / delete allowed, but only as the identity test account and under Mutation Discipline (§5).forbidden — do not exercise this environment at all.Safety rules — enforced regardless of config:
exploration block, or an unconfigured env → treat as read-only. Never mutate without an explicit policy.prod / production) defaults to forbidden. It may be raised to full only when a written prodMutationAck justification is present (this is how a single-environment app — e.g. a local-only game whose only "env" is production and whose mutations are the user's own local save — deliberately opts in). A bare production: { "mutation": "full" } with no prodMutationAck is downgraded to forbidden, and you warn.identity test account.Look for the project's personas: wiki/personas/** (target-player archetypes, stakeholders) and persona subagents (e.g. the lisa-phaser target-player / player-advocate agents).
Apply the interface's read-only actions always; the mutate actions only when the policy is full.
GETs (curl/httpie). Mutate: exercise representative POST/PUT/DELETE flows with test data as the identity; check status codes, payload shapes, and error responses.bun run dev + Playwright), drive via keyboard/pointer into the canvas, and read state visually via screenshots (not the accessibility tree). Mutation is usually local save state. Judge readability, game-feel, and input responsiveness — not DOM breakpoints.--help, read-only commands, dry-runs. Mutate: run state-changing commands with disposable inputs.cdk synth → read the generated template; cdk diff vs. the deployed env; verify the resources, IAM, and outputs express what a consumer would expect. Flag over-broad IAM, missing/opaque outputs, resources that don't serve their stated purpose, and drift. Mutate (only when mutation: "full" and provision: true on an ephemeral/sandbox env): cdk deploy to the sandbox → recurse into the API/web playbook against the provisioned resources → cdk destroy. Never deploy to a real account without explicit sandbox-provisioning config.fullA real user creates, edits, and deletes things — exercise those flows when, and only when, the policy allows and always as the identity account.
qa- or codex-.Structured, raw observations for the caller — what you did, as whom (which persona / generic user), where (env + mutation level), what you saw, and what you could not reach and why (especially policy boundaries you stopped at). You do not file tickets or write plans; the caller does.
tools
Configure the official SonarQube plugin + MCP as Lisa's single Sonar substrate across every supported coding agent. Installs/updates the SonarQube CLI, authenticates (browser login on a dev machine, or SONARQUBE_CLI_TOKEN headless), selects the Test Manager target, runs `sonar integrate <agent>` for each supported agent (Claude, Codex, Cursor, Copilot, Antigravity) and wires the MCP for OpenCode, then writes only non-secret policy to .lisa.config.json. Separate from the CI SonarCloud scan gate, which is unchanged.
tools
Configure the official SonarQube plugin + MCP as Lisa's single Sonar substrate across every supported coding agent. Installs/updates the SonarQube CLI, authenticates (browser login on a dev machine, or SONARQUBE_CLI_TOKEN headless), selects the Test Manager target, runs `sonar integrate <agent>` for each supported agent (Claude, Codex, Cursor, Copilot, Antigravity) and wires the MCP for OpenCode, then writes only non-secret policy to .lisa.config.json. Separate from the CI SonarCloud scan gate, which is unchanged.
tools
Configure the official SonarQube plugin + MCP as Lisa's single Sonar substrate across every supported coding agent. Installs/updates the SonarQube CLI, authenticates (browser login on a dev machine, or SONARQUBE_CLI_TOKEN headless), selects the Test Manager target, runs `sonar integrate <agent>` for each supported agent (Claude, Codex, Cursor, Copilot, Antigravity) and wires the MCP for OpenCode, then writes only non-secret policy to .lisa.config.json. Separate from the CI SonarCloud scan gate, which is unchanged.
tools
Configure the official SonarQube plugin + MCP as Lisa's single Sonar substrate across every supported coding agent. Installs/updates the SonarQube CLI, authenticates (browser login on a dev machine, or SONARQUBE_CLI_TOKEN headless), selects the Test Manager target, runs `sonar integrate <agent>` for each supported agent (Claude, Codex, Cursor, Copilot, Antigravity) and wires the MCP for OpenCode, then writes only non-secret policy to .lisa.config.json. Separate from the CI SonarCloud scan gate, which is unchanged.