@codyswann/lisa 2.187.3 → 2.188.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/package.json +1 -1
- package/plugins/lisa/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa/.codex-plugin/plugin.json +1 -1
- package/plugins/lisa/agents/github-agent.md +1 -1
- package/plugins/lisa/agents/jira-agent.md +1 -1
- package/plugins/lisa/agents/linear-agent.md +1 -1
- package/plugins/lisa/commands/exploratory-qa.md +7 -0
- package/plugins/lisa/rules/eager/pre-flight-autofill.md +1 -1
- package/plugins/lisa/rules/reference/config-resolution.md +4 -3
- package/plugins/lisa/rules/reference/pre-flight-autofill.md +3 -3
- package/plugins/lisa/skills/exploratory-qa/SKILL.md +91 -0
- package/plugins/lisa/skills/exploratory-qa/agents/openai.yaml +4 -0
- package/plugins/lisa/skills/implement/SKILL.md +1 -1
- package/plugins/lisa/skills/product-walkthrough/SKILL.md +36 -61
- package/plugins/lisa/skills/product-walkthrough/agents/openai.yaml +2 -2
- package/plugins/lisa/skills/use-the-product/SKILL.md +86 -0
- package/plugins/lisa/skills/use-the-product/agents/openai.yaml +4 -0
- package/plugins/lisa-agy/agents/github-agent.md +1 -1
- package/plugins/lisa-agy/agents/jira-agent.md +1 -1
- package/plugins/lisa-agy/agents/linear-agent.md +1 -1
- package/plugins/lisa-agy/commands/exploratory-qa.md +7 -0
- package/plugins/lisa-agy/plugin.json +1 -1
- package/plugins/lisa-agy/skills/exploratory-qa/SKILL.md +91 -0
- package/plugins/lisa-agy/skills/implement/SKILL.md +1 -1
- package/plugins/lisa-agy/skills/product-walkthrough/SKILL.md +36 -61
- package/plugins/lisa-agy/skills/use-the-product/SKILL.md +86 -0
- package/plugins/lisa-cdk/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-cdk/.codex-plugin/plugin.json +1 -1
- package/plugins/lisa-cdk-agy/plugin.json +1 -1
- package/plugins/lisa-cdk-copilot/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-cdk-cursor/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-copilot/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-copilot/agents/github-agent.agent.md +1 -1
- package/plugins/lisa-copilot/agents/jira-agent.agent.md +1 -1
- package/plugins/lisa-copilot/agents/linear-agent.agent.md +1 -1
- package/plugins/lisa-copilot/commands/exploratory-qa.md +7 -0
- package/plugins/lisa-copilot/rules/eager/pre-flight-autofill.md +1 -1
- package/plugins/lisa-copilot/rules/reference/config-resolution.md +4 -3
- package/plugins/lisa-copilot/rules/reference/pre-flight-autofill.md +3 -3
- package/plugins/lisa-copilot/skills/exploratory-qa/SKILL.md +91 -0
- package/plugins/lisa-copilot/skills/implement/SKILL.md +1 -1
- package/plugins/lisa-copilot/skills/product-walkthrough/SKILL.md +36 -61
- package/plugins/lisa-copilot/skills/use-the-product/SKILL.md +86 -0
- package/plugins/lisa-cursor/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-cursor/agents/github-agent.md +1 -1
- package/plugins/lisa-cursor/agents/jira-agent.md +1 -1
- package/plugins/lisa-cursor/agents/linear-agent.md +1 -1
- package/plugins/lisa-cursor/commands/exploratory-qa.md +7 -0
- package/plugins/lisa-cursor/rules/config-resolution-reference.mdc +4 -3
- package/plugins/lisa-cursor/rules/pre-flight-autofill-reference.mdc +3 -3
- package/plugins/lisa-cursor/rules/pre-flight-autofill.mdc +1 -1
- package/plugins/lisa-cursor/skills/exploratory-qa/SKILL.md +91 -0
- package/plugins/lisa-cursor/skills/implement/SKILL.md +1 -1
- package/plugins/lisa-cursor/skills/product-walkthrough/SKILL.md +36 -61
- package/plugins/lisa-cursor/skills/use-the-product/SKILL.md +86 -0
- package/plugins/lisa-expo/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-expo/.codex-plugin/plugin.json +1 -1
- package/plugins/lisa-expo/commands/e2e-coverage-gaps.md +1 -1
- package/plugins/lisa-expo-agy/commands/e2e-coverage-gaps.md +1 -1
- package/plugins/lisa-expo-agy/plugin.json +1 -1
- package/plugins/lisa-expo-copilot/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-expo-copilot/commands/e2e-coverage-gaps.md +1 -1
- package/plugins/lisa-expo-cursor/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-expo-cursor/commands/e2e-coverage-gaps.md +1 -1
- package/plugins/lisa-harper-fabric/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-harper-fabric/.codex-plugin/plugin.json +1 -1
- package/plugins/lisa-harper-fabric/commands/e2e-coverage-gaps.md +1 -1
- package/plugins/lisa-harper-fabric-agy/commands/e2e-coverage-gaps.md +1 -1
- package/plugins/lisa-harper-fabric-agy/plugin.json +1 -1
- package/plugins/lisa-harper-fabric-copilot/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-harper-fabric-copilot/commands/e2e-coverage-gaps.md +1 -1
- package/plugins/lisa-harper-fabric-cursor/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-harper-fabric-cursor/commands/e2e-coverage-gaps.md +1 -1
- package/plugins/lisa-nestjs/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-nestjs/.codex-plugin/plugin.json +1 -1
- package/plugins/lisa-nestjs-agy/plugin.json +1 -1
- package/plugins/lisa-nestjs-copilot/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-nestjs-cursor/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-openclaw/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-openclaw/.codex-plugin/plugin.json +1 -1
- package/plugins/lisa-openclaw-agy/plugin.json +1 -1
- package/plugins/lisa-openclaw-copilot/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-openclaw-cursor/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-phaser/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-phaser/.codex-plugin/plugin.json +1 -1
- package/plugins/lisa-phaser-agy/plugin.json +1 -1
- package/plugins/lisa-phaser-copilot/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-phaser-cursor/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-rails/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-rails/.codex-plugin/plugin.json +1 -1
- package/plugins/lisa-rails/commands/e2e-coverage-gaps.md +1 -1
- package/plugins/lisa-rails-agy/commands/e2e-coverage-gaps.md +1 -1
- package/plugins/lisa-rails-agy/plugin.json +1 -1
- package/plugins/lisa-rails-copilot/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-rails-copilot/commands/e2e-coverage-gaps.md +1 -1
- package/plugins/lisa-rails-cursor/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-rails-cursor/commands/e2e-coverage-gaps.md +1 -1
- package/plugins/lisa-typescript/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-typescript/.codex-plugin/plugin.json +1 -1
- package/plugins/lisa-typescript-agy/plugin.json +1 -1
- package/plugins/lisa-typescript-copilot/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-typescript-cursor/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-wiki/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-wiki/.codex-plugin/plugin.json +1 -1
- package/plugins/lisa-wiki-agy/plugin.json +1 -1
- package/plugins/lisa-wiki-copilot/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-wiki-cursor/.claude-plugin/plugin.json +1 -1
- package/plugins/src/base/agents/github-agent.md +1 -1
- package/plugins/src/base/agents/jira-agent.md +1 -1
- package/plugins/src/base/agents/linear-agent.md +1 -1
- package/plugins/src/base/commands/exploratory-qa.md +7 -0
- package/plugins/src/base/rules/eager/pre-flight-autofill.md +1 -1
- package/plugins/src/base/rules/reference/config-resolution.md +4 -3
- package/plugins/src/base/rules/reference/pre-flight-autofill.md +3 -3
- package/plugins/src/base/skills/exploratory-qa/SKILL.md +91 -0
- package/plugins/src/base/skills/implement/SKILL.md +1 -1
- package/plugins/src/base/skills/product-walkthrough/SKILL.md +36 -61
- package/plugins/src/base/skills/use-the-product/SKILL.md +86 -0
- package/plugins/src/expo/commands/e2e-coverage-gaps.md +1 -1
- package/plugins/src/harper-fabric/commands/e2e-coverage-gaps.md +1 -1
- package/plugins/src/rails/commands/e2e-coverage-gaps.md +1 -1
- package/plugins/lisa-expo/commands/exploratory-qa.md +0 -7
- package/plugins/lisa-expo/skills/exploratory-qa/SKILL.md +0 -264
- package/plugins/lisa-expo/skills/exploratory-qa/agents/openai.yaml +0 -4
- package/plugins/lisa-expo-agy/commands/exploratory-qa.md +0 -7
- package/plugins/lisa-expo-agy/skills/exploratory-qa/SKILL.md +0 -264
- package/plugins/lisa-expo-copilot/commands/exploratory-qa.md +0 -7
- package/plugins/lisa-expo-copilot/skills/exploratory-qa/SKILL.md +0 -264
- package/plugins/lisa-expo-cursor/commands/exploratory-qa.md +0 -7
- package/plugins/lisa-expo-cursor/skills/exploratory-qa/SKILL.md +0 -264
- package/plugins/lisa-harper-fabric/commands/exploratory-qa.md +0 -7
- package/plugins/lisa-harper-fabric/skills/exploratory-qa/SKILL.md +0 -264
- package/plugins/lisa-harper-fabric/skills/exploratory-qa/agents/openai.yaml +0 -4
- package/plugins/lisa-harper-fabric-agy/commands/exploratory-qa.md +0 -7
- package/plugins/lisa-harper-fabric-agy/skills/exploratory-qa/SKILL.md +0 -264
- package/plugins/lisa-harper-fabric-copilot/commands/exploratory-qa.md +0 -7
- package/plugins/lisa-harper-fabric-copilot/skills/exploratory-qa/SKILL.md +0 -264
- package/plugins/lisa-harper-fabric-cursor/commands/exploratory-qa.md +0 -7
- package/plugins/lisa-harper-fabric-cursor/skills/exploratory-qa/SKILL.md +0 -264
- package/plugins/lisa-rails/commands/exploratory-qa.md +0 -7
- package/plugins/lisa-rails/skills/exploratory-qa/SKILL.md +0 -264
- package/plugins/lisa-rails/skills/exploratory-qa/agents/openai.yaml +0 -4
- package/plugins/lisa-rails-agy/commands/exploratory-qa.md +0 -7
- package/plugins/lisa-rails-agy/skills/exploratory-qa/SKILL.md +0 -264
- package/plugins/lisa-rails-copilot/commands/exploratory-qa.md +0 -7
- package/plugins/lisa-rails-copilot/skills/exploratory-qa/SKILL.md +0 -264
- package/plugins/lisa-rails-cursor/commands/exploratory-qa.md +0 -7
- package/plugins/lisa-rails-cursor/skills/exploratory-qa/SKILL.md +0 -264
- package/plugins/src/expo/commands/exploratory-qa.md +0 -7
- package/plugins/src/expo/skills/exploratory-qa/SKILL.md +0 -264
- package/plugins/src/harper-fabric/commands/exploratory-qa.md +0 -7
- package/plugins/src/harper-fabric/skills/exploratory-qa/SKILL.md +0 -264
- package/plugins/src/rails/commands/exploratory-qa.md +0 -7
- package/plugins/src/rails/skills/exploratory-qa/SKILL.md +0 -264
|
@@ -4,4 +4,4 @@ allowed-tools: ["Skill"]
|
|
|
4
4
|
argument-hint: "[target-url | env] [ready=true|false]"
|
|
5
5
|
---
|
|
6
6
|
|
|
7
|
-
Use the /lisa-rails:e2e-coverage-gaps skill to inventory the app's routes and the existing Playwright suite, find uncovered and happy-path-only paths, confirm each gap in the running app, and file one build-ready missing-test ticket per gap via lisa:tracker-write (build-ready per the ready flag, default true). For human usability/experience findings, use /lisa
|
|
7
|
+
Use the /lisa-rails:e2e-coverage-gaps skill to inventory the app's routes and the existing Playwright suite, find uncovered and happy-path-only paths, confirm each gap in the running app, and file one build-ready missing-test ticket per gap via lisa:tracker-write (build-ready per the ready flag, default true). For human usability/experience findings, use /lisa:exploratory-qa. $ARGUMENTS
|
|
@@ -4,4 +4,4 @@ allowed-tools: ["Skill"]
|
|
|
4
4
|
argument-hint: "[target-url | env] [ready=true|false]"
|
|
5
5
|
---
|
|
6
6
|
|
|
7
|
-
Use the /lisa-rails:e2e-coverage-gaps skill to inventory the app's routes and the existing Playwright suite, find uncovered and happy-path-only paths, confirm each gap in the running app, and file one build-ready missing-test ticket per gap via lisa:tracker-write (build-ready per the ready flag, default true). For human usability/experience findings, use /lisa
|
|
7
|
+
Use the /lisa-rails:e2e-coverage-gaps skill to inventory the app's routes and the existing Playwright suite, find uncovered and happy-path-only paths, confirm each gap in the running app, and file one build-ready missing-test ticket per gap via lisa:tracker-write (build-ready per the ready flag, default true). For human usability/experience findings, use /lisa:exploratory-qa. $ARGUMENTS
|
|
@@ -150,4 +150,4 @@ Note: `done` may be a string or an env-keyed map (`{ dev, staging, production }`
|
|
|
150
150
|
- Never create or materially edit an issue by calling `gh issue create` / `gh issue edit` directly — always delegate to `github-write-issue` (or, from a vendor-neutral caller, `tracker-write`) so relationships, Gherkin criteria, and metadata gates are enforced.
|
|
151
151
|
- If sign-in credentials are in the issue body, extract and pass them to the flow. If the issue touches an authenticated surface and credentials are missing, that is a Step 2 failure — block and reassign rather than guessing.
|
|
152
152
|
- If the issue has a `## Validation Journey` section, pass it to the verifier agent. The Validation Journey's local-verification step must point at the target backend environment named in the body.
|
|
153
|
-
- For bug issues, the reported environment named in the issue body or reproduction steps drives the implementation base branch via `deploy.branches
|
|
153
|
+
- For bug issues, the reported environment named in the issue body or reproduction steps drives the implementation base branch via `deploy.branches`. If no environment can be found anywhere in the ticket, fall back to the configured default branch and record that assumption. If the reported environment is present but missing from `deploy.branches`, or its mapped branch is absent on the remote, stop and report the missing environment/branch mapping instead of defaulting. A non-integration environment fix must be merged and verified on that environment branch, then forward cherry-picked down to the integration branch through a linked follow-up.
|
|
@@ -130,4 +130,4 @@ Note: `done` may be a string or an env-keyed map (`{ dev, staging, production }`
|
|
|
130
130
|
- Never create or materially edit a ticket by calling MCP write tools directly — always delegate to `jira-write-ticket` so relationships, Gherkin criteria, and metadata gates are enforced
|
|
131
131
|
- If sign-in credentials are in the ticket, extract and pass them to the flow. If the ticket touches an authenticated surface and credentials are missing, that is a Step 2 failure — block and reassign rather than guessing.
|
|
132
132
|
- If the ticket has a Validation Journey section, pass it to the verifier agent. The Validation Journey's local-verification step must point at the target backend environment named in the description (for FE work, that's the deployed backend QA reported against).
|
|
133
|
-
- For bug tickets, the reported environment named in the description or reproduction steps drives the implementation base branch via `deploy.branches
|
|
133
|
+
- For bug tickets, the reported environment named in the description or reproduction steps drives the implementation base branch via `deploy.branches`. If no environment can be found anywhere in the ticket, fall back to the configured default branch and record that assumption. If the reported environment is present but missing from `deploy.branches`, or its mapped branch is absent on the remote, stop and report the missing environment/branch mapping instead of defaulting. A non-integration environment fix must be merged and verified on that environment branch, then forward cherry-picked down to the integration branch through a linked follow-up.
|
|
@@ -133,4 +133,4 @@ The label transitions ARE the canonical signal. The native `state` field stays a
|
|
|
133
133
|
- Never create or materially edit an item by calling MCP write tools directly — always delegate to `linear-write-issue` so relationships, Gherkin criteria, and metadata gates are enforced. Two explicit exceptions are permitted: (1) the Step 2 pre-flight failure path (when `linear-verify` returns `FAIL`) may call `lisa:linear-access operation: save-issue` and `lisa:linear-access operation: save-comment` directly to set `status:blocked`, add the configured `human_needed` marker label, and reassign to the creator — this narrow exception is already granted by the rule above; (2) the Step 3 triage path may call `lisa:linear-access operation: save-comment` to post triage findings and `lisa:linear-access operation: save-issue` to add the `claude-triaged-{repo}` label — these are lightweight metadata updates that do not create or materially edit ticket content and therefore do not need to route through `linear-write-issue`.
|
|
134
134
|
- If sign-in credentials are in the item, extract and pass them to the flow. If the item touches an authenticated surface and credentials are missing, that is a Step 2 failure — block and reassign rather than guessing.
|
|
135
135
|
- If the item has a Validation Journey section, pass it to the verifier agent. The Validation Journey's local-verification step must point at the target backend environment named in the description.
|
|
136
|
-
- For bug items, the reported environment named in the description or reproduction steps drives the implementation base branch via `deploy.branches
|
|
136
|
+
- For bug items, the reported environment named in the description or reproduction steps drives the implementation base branch via `deploy.branches`. If no environment can be found anywhere in the item, fall back to the configured default branch and record that assumption. If the reported environment is present but missing from `deploy.branches`, or its mapped branch is absent on the remote, stop and report the missing environment/branch mapping instead of defaulting. A non-integration environment fix must be merged and verified on that environment branch, then forward cherry-picked down to the integration branch through a linked follow-up.
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
---
|
|
2
|
+
description: "Run a first-time-user exploratory QA pass on any product type (DOM web app, HTTP/API backend, canvas game, CLI/library, IaC/CDK): experience the product the way a brand-new end user would by driving its real consumer-facing interface via the use-the-product core (which detects the product type, resolves the per-environment mutation policy from .lisa.config.json so production is never mutated by accident, and explores through the project's personas when defined), finding anything confusing, broken, or hard to use, and filing each finding (bug or usability issue) as a tracked work item via lisa:tracker-write. Static scans, HTTP fetches, screenshots alone, or console/network checks alone are not sufficient. The optional ready flag marks tickets build-ready (auto-picked-up by lisa:intake) or leaves them in the backlog for human triage (default). For gaps in the automated test suite, use the e2e-coverage-gaps skill if your stack provides one."
|
|
3
|
+
allowed-tools: ["Skill"]
|
|
4
|
+
argument-hint: "[target-url | env] [ready=true|false]"
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
Use the lisa:exploratory-qa skill to experience the product the way a brand-new first-time end user would — driving its real consumer-facing interface via the use-the-product core (product-type detection, per-environment mutation policy, and persona-lensed exploration), finding anything confusing, broken, or hard to use, and filing each finding (bugs, usability/clarity issues) as a tracked work item via lisa:tracker-write, build-ready or in triage per the ready flag (default: triage). Static scans, HTTP fetches, screenshots alone, or console/network checks alone are not enough. For automated test-coverage gaps, use the e2e-coverage-gaps skill if your stack provides one. $ARGUMENTS
|
|
@@ -25,7 +25,7 @@ information was already on the ticket; only the structure was missing).
|
|
|
25
25
|
reported environment from the item body/reproduction steps before recommending
|
|
26
26
|
any default: bare environment names (`dev`, `staging`, `prod`, `production`)
|
|
27
27
|
and environment-bearing URLs (for example `staging.<domain>`, `gql.staging.*`,
|
|
28
|
-
`dev.<domain>`) are authoritative. Only recommend the
|
|
28
|
+
`dev.<domain>`) are authoritative. Only recommend the repo's remote default branch when
|
|
29
29
|
no environment is discoverable anywhere in the work item, and record that as
|
|
30
30
|
an assumption.
|
|
31
31
|
- **Tier B — irreducibly human:** real credentials/access that exist nowhere on
|
|
@@ -463,9 +463,10 @@ If a project's terminal state is the same regardless of env, set `done` to a str
|
|
|
463
463
|
|
|
464
464
|
`deploy.branches` is also read in the **forward** direction by the build flow (`lisa:implement`): the environment a work item targets determines the branch the work is built on and the branch the PR opens against.
|
|
465
465
|
|
|
466
|
-
1. **Resolve the work item's target environment** — its `## Target Backend Environment` field.
|
|
467
|
-
2. **
|
|
468
|
-
3. **
|
|
466
|
+
1. **Resolve the work item's target environment** — its `## Target Backend Environment` field.
|
|
467
|
+
2. **If no environment is named**, use the **remote default branch** (`gh repo view --json defaultBranchRef`, or `origin/HEAD`) and record that default-branch assumption.
|
|
468
|
+
3. **If a reported environment exists**, map env → base branch via `deploy.branches` (e.g. `staging → staging`, `production → main`). A reported env absent from `deploy.branches`, or a mapped branch missing from the remote, must stop and report the exact missing environment-to-branch mapping; never guess and never silently fall back.
|
|
469
|
+
4. **Before any code is written**, `lisa:implement` fetches and **rebases the working branch onto `origin/<base>`, resolving conflicts**, so implementation builds on the latest target-environment code. **The PR then opens against that same base branch** (`target_branch=<base>` to `lisa:git-submit-pr`).
|
|
469
470
|
|
|
470
471
|
This is the exact inverse of the env-keyed `done` "Branch inference" above: `done` derives the env *from* the PR base branch (reverse); the build flow derives the base branch *from* the env (forward). Both use the one `deploy.branches` map, so the branch a PR targets and the `done` status it earns always agree.
|
|
471
472
|
|
|
@@ -54,9 +54,9 @@ spec.
|
|
|
54
54
|
reproduction steps. Bare words such as `dev`, `staging`, `prod`, and
|
|
55
55
|
`production` count, as do environment-bearing URLs such as
|
|
56
56
|
`staging.<domain>`, `gql.staging.*`, and `dev.<domain>`. That reported
|
|
57
|
-
environment is authoritative for the draft. Only recommend
|
|
58
|
-
default
|
|
59
|
-
|
|
57
|
+
environment is authoritative for the draft. Only recommend the repo's
|
|
58
|
+
remote default branch when no environment is discoverable anywhere in the
|
|
59
|
+
work item, and record the default as an explicit assumption.
|
|
60
60
|
|
|
61
61
|
**Tier B — irreducibly human (cannot invent — but still propose a default):**
|
|
62
62
|
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: exploratory-qa
|
|
3
|
+
description: First-time-user exploratory QA pass for ANY product type (DOM web app, HTTP/API backend, canvas game, CLI/library, IaC/CDK) that FEEDS THE LIFECYCLE. Use when asked to experience a product the way a brand-new end user would — driving its real consumer-facing interface via the `use-the-product` core (which detects the product type, resolves the per-environment mutation policy from .lisa.config.json so production data is never mutated by accident, and explores through the project's personas when it defines them) to find anything confusing, broken, or hard to use (unclear purpose, human-facing jargon, machine-style labels, contextless data, wrong control semantics, dead-end flows, incomplete end-states, clipped/unreachable controls, slow loads). Static route scans, HTTP fetches, screenshots alone, or console/network checks alone are not sufficient evidence. Instead of writing a report file, it files every finding as a tracked work item via lisa:tracker-write. A `ready` parameter controls whether those tickets are created build-ready (auto-picked-up by lisa:intake) or left in the backlog for human triage (default). For gaps in the automated test suite, use e2e-coverage-gaps instead.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Exploratory QA
|
|
7
|
+
|
|
8
|
+
## Overview
|
|
9
|
+
|
|
10
|
+
Experience the product the way a **brand-new end user** would: drive its real consumer-facing interface and actually try to use it, then surface anything **confusing, broken, or hard to understand**. This is a usability/experience pass, **not** a test-coverage audit (for that, use `e2e-coverage-gaps`). Every finding is filed as a tracked work item so it enters the Lisa lifecycle — no static report file.
|
|
11
|
+
|
|
12
|
+
**How you drive the product is owned by the `use-the-product` core skill.** Invoke it first: it detects the product type (web / API / game / CLI / IaC), resolves the target environment and its **mutation policy** (so you never mutate production without an explicit, justified opt-in), and discovers the project's **personas** so you can explore as each one. This skill supplies the **QA lens** — what to look for and how to file it.
|
|
13
|
+
|
|
14
|
+
## Parameters
|
|
15
|
+
|
|
16
|
+
- **`target-url | env`** (first positional) — what to explore (passed through to `use-the-product`).
|
|
17
|
+
- **`ready=true|false`** — the build-ready state for the tickets this pass creates.
|
|
18
|
+
- `ready=true` → created build-ready, so `lisa:intake` / the build-intake scanner auto-picks them up.
|
|
19
|
+
- `ready=false` (**default**) → created in the backlog for a human to review and promote.
|
|
20
|
+
|
|
21
|
+
## 1. Set up
|
|
22
|
+
|
|
23
|
+
- **Invoke `use-the-product`** to detect the product type, resolve the environment + mutation policy, and discover personas/subagents. Everything about *how* to drive the product, *where*, and *how much you may mutate* comes from there — do not re-derive it.
|
|
24
|
+
- **Confirm the tracker is configured.** Findings are filed as tickets, so read `tracker` from `.lisa.config.json` (local overrides global). If unset, stop and report that the tracker must be configured (`/lisa:setup:jira` / `:github` / `:linear`) before exploratory QA can file findings — do not silently fall back to a report file.
|
|
25
|
+
- Read the `ready` flag (default `false`).
|
|
26
|
+
|
|
27
|
+
## 2. Arrive cold and use it like a human
|
|
28
|
+
|
|
29
|
+
- Start with **no prior knowledge** — do not pre-read the codebase to learn the intended flows; discover them the way a user would. Form a first impression: is it obvious what this product is, what to do first, and where to go next?
|
|
30
|
+
- Then actually attempt real tasks through the interface (per `use-the-product`'s per-type playbook), exercising representative controls/endpoints/commands — a first-time user explores, makes mistakes, and tries the obvious thing.
|
|
31
|
+
|
|
32
|
+
## 3. The QA lens — what to look for
|
|
33
|
+
|
|
34
|
+
Cover at least these dimensions unless the user narrows scope. Most are universal; the web-specific ones are marked and have per-type equivalents in §4.
|
|
35
|
+
|
|
36
|
+
- **Comprehension & labeling:** user-facing copy must read like something a normal first-time user understands. Flag machine-style/developer labels (raw IDs, enum keys, `snake_case`, `null`/`undefined`, untranslated i18n keys), admin/database terms ("metadata", "rows", "record", "entity"), unexplained jargon, unclear button/menu names, and meaningless icons. If a label would make a non-technical user ask "what does that mean?", file a clarity ticket.
|
|
37
|
+
- **Data usefulness & context:** facts, metrics, and tables must help a person understand the surface, not just prove extraction happened. If a user can't tell what a number or field refers to without rereading the raw source, file a ticket to add context (excerpts, labels, grouping, provenance) or hide it.
|
|
38
|
+
- **Data volume & trust:** compare visible data to what the surface promises. A rich view with only a few items can read as broken/filtered/still-loading. File a finding when sparse data isn't explained (result counts, active filters, reset affordances, coverage status, sample labeling).
|
|
39
|
+
- **Controls & mental model:** controls must match what they do (sort ≠ filter; search ≠ facet; finite domains want selects/typeaheads, not blank text inputs). Flag controls that make users guess spelling/casing, hide the option universe, or use the wrong component.
|
|
40
|
+
- **Flow completeness & expected counterparts:** a screen that gates access or shows one side of a standard paired flow must offer the other side, or a clear path to it. A new user must never hit a dead end with no next step. Flag: **sign-in with no sign-up** (or vice-versa), **no account recovery** ("Forgot password?", resend verification), **no exit from a state** (no sign-out; a modal/wizard with no back/close/cancel), **one-way actions** (create with no edit/delete where both are expected), **unreachable entry points** (a feature only reachable by guessing a URL; an empty state with no primary action). When the missing counterpart makes a core task impossible for a class of users, file a `Bug`; otherwise a usability `Improvement`.
|
|
41
|
+
- **Action preconditions & incomplete end-states:** an action that needs multiple inputs or a prerequisite (compare, merge, bulk-edit) should guide the user to satisfy it — disable/explain until met, collect inputs first, or give the destination an in-place control. Actually trigger these and watch where they land; flag when a primary action fires under-satisfied and strands the user, lands on an empty/partial end-state with no next step, or is offered where it cannot succeed. Left unable to finish → `Bug`; works but confusing → `Improvement`.
|
|
42
|
+
- **Navigation clarity:** is it obvious how to get somewhere and back? Flag dead ends, hidden entry points, surprising redirects, broken links, no clear "home", and duplicated nav that competes for space without page-specific value.
|
|
43
|
+
- **Behavior correctness:** does the obvious action do what a user expects? Confusing errors, silent failures, disabled controls with no explanation, state that doesn't persist.
|
|
44
|
+
- **Affordance clarity:** can the user tell what is clickable, required, in-progress, or complete?
|
|
45
|
+
- **Load & responsiveness:** long/unclear loads, blank or skeleton-only shells, spinners with no progress. Flag surfaces that report "loaded" but where meaningful content arrives much later. Capture user-perceived timings (shell visible, first meaningful content, stable content); if the delay is noticeable, file it even when the eventual content is correct.
|
|
46
|
+
- **Visual/layout quality (DOM web):** cut-off/truncated text, overlap, cramped density, offscreen controls, accidental horizontal scroll. **Do not judge by eyeballing a screenshot alone** — confirm with the layout-integrity sweep in §4.
|
|
47
|
+
- **Consistency / standard UX:** components, spacing, terminology, and interaction patterns should be consistent and follow common conventions. Flag anything non-standard or screen-to-screen drift.
|
|
48
|
+
|
|
49
|
+
## 4. Type-specific depth
|
|
50
|
+
|
|
51
|
+
- **DOM web app — breakpoints & layout integrity.** Sweep a range of widths, including the *in-between* ones where clipping appears (e.g. 360, 390, 414, 600, 768, 834, 1024, 1280, 1440 plus ~900–1180 steps), and re-walk key paths at each. At every width, in addition to looking, take DOM measurements and treat as findings: **container overflow** (`documentElement.scrollWidth > clientWidth`); **clipped/offscreen controls** (a control's `getBoundingClientRect()` falling outside the viewport or an `overflow:hidden|clip|auto|scroll` ancestor — e.g. a submit button cut off by its filter card); **truncated meaningful text** (`scrollWidth > clientWidth` / ellipsis on text that carries meaning); **colliding controls** (label overlapping an adjacent control with no gap). A primary/interactive control that is clipped, offscreen, or unreachable is a **`Bug`**, not an Improvement.
|
|
52
|
+
- **HTTP / API backend.** Judge the *contract as a consumer experiences it*: unclear/inconsistent status codes, error responses with no actionable message, payloads exposing internal shapes (raw enums, DB column names), missing pagination/among-counts, endpoints that 500 on obvious edge inputs. A broken/incorrect response is a `Bug`; a confusing-but-working contract is an `Improvement`.
|
|
53
|
+
- **Canvas game.** Judge readability at gameplay scale, input responsiveness/latency, game-feel, unclear objectives, and silent state changes — not DOM breakpoints. A soft-lock or lost progress is a `Bug`; unclear-but-playable friction is an `Improvement`.
|
|
54
|
+
- **CLI / library.** Judge help/output clarity, error messages, discoverability of commands, and surprising side effects. A wrong result / crash is a `Bug`; confusing UX is an `Improvement`.
|
|
55
|
+
- **IaC / CDK (read-only).** From `cdk synth`/`diff`: over-broad IAM, missing/opaque stack outputs, resources that don't serve their stated purpose, drift. A security-relevant misconfiguration is a `Bug`; unclear-but-correct infra is an `Improvement`.
|
|
56
|
+
|
|
57
|
+
## 5. Mutation
|
|
58
|
+
|
|
59
|
+
Whether you may create/edit/delete — and as which account — is set by the `use-the-product` mutation policy (`read-only` vs `full`, `identity`, production rules). Follow its **Mutation Discipline** when the policy is `full` (prefixed test data, identify + verify cleanup, record residue). Never mutate an env the policy marks `read-only` or `forbidden`; if a finding can only be confirmed by a forbidden mutation, file it as observed-and-blocked rather than escalating.
|
|
60
|
+
|
|
61
|
+
## 6. File findings as tracked work
|
|
62
|
+
|
|
63
|
+
No report file. Every finding becomes a **leaf work item** via `lisa:tracker-write` (the vendor-neutral writer — it dispatches to the configured tracker and runs the validation gate; never call a vendor `*-write-*` skill directly):
|
|
64
|
+
|
|
65
|
+
| Finding | `issue_type` | `build_ready` |
|
|
66
|
+
|---|---|---|
|
|
67
|
+
| User-visible **bug** (broken behavior) | `Bug` | the `ready` flag (default `false`) |
|
|
68
|
+
| **Usability / UX / clarity issue** | `Improvement` | the `ready` flag (default `false`) |
|
|
69
|
+
|
|
70
|
+
Each finding is a flat leaf, so `build_ready` applies directly — pass it explicitly on every create. Each ticket MUST be a complete spec (the validator rejects thin tickets): a **three-audience description**; for a **bug**, exact reproduction steps, observed-vs-expected, the env / account / interface it occurred at, and evidence; for a **usability issue**, the observed friction, who it affects, **where**, and the proposed improvement; and **Gherkin acceptance criteria** for the fixed behavior.
|
|
71
|
+
|
|
72
|
+
### Idempotency — don't spam duplicates
|
|
73
|
+
|
|
74
|
+
Re-running a pass must not refile the same finding. Before creating a ticket, search the tracker for an **open** ticket carrying a stable marker `[lisa-exploratory-qa] <finding-key>` in its body (the `<finding-key>` is a stable slug of surface + symptom, e.g. `settings-modal/horizontal-overflow@tablet`). If one exists, reference/update it instead; only create when none exists. **Match by the marker, never by title.** A *closed* prior ticket does not suppress a new one — a recurrence after a fix is a genuine regression.
|
|
75
|
+
|
|
76
|
+
## Output
|
|
77
|
+
|
|
78
|
+
No report file. Emit a concise in-session summary:
|
|
79
|
+
|
|
80
|
+
- **Scope:** product type, target env + mutation level, persona(s) explored as, tool, build/version if visible, date.
|
|
81
|
+
- **First impression:** could a new user tell what the product is and what to do first?
|
|
82
|
+
- **Findings filed**, bucketed by type — each with its **created or referenced ticket ref** and **build-ready state**.
|
|
83
|
+
- **Observed but not filed:** anything noticed but intentionally not ticketed (including forbidden-mutation blocks), with why.
|
|
84
|
+
|
|
85
|
+
## Quality bar
|
|
86
|
+
|
|
87
|
+
- Explore as a true first-time user — judge clarity, not whether you (who can read the code) can figure it out.
|
|
88
|
+
- Every ticket must stand alone for an implementer who was not in the session.
|
|
89
|
+
- Do not claim cleanup succeeded unless verified.
|
|
90
|
+
- File per the `ready` flag (default: backlog for human triage).
|
|
91
|
+
- Route automated-coverage gaps to `e2e-coverage-gaps`; preserve unrelated repo changes.
|
|
@@ -71,7 +71,7 @@ Using the general-purpose agent in Team Lead session, Determine the name of this
|
|
|
71
71
|
Using the general-purpose agent in Team Lead session, **determine the base branch from the ticket's target environment, then sync the working branch onto the latest of it before any work** — so implementation always builds on current target-environment code:
|
|
72
72
|
|
|
73
73
|
1. **Resolve the target environment** from the resolved work item — its `## Target Backend Environment` section (the field the `*-write-*` / `*-add-journey` skills record). For bug work, the environment named in the report is authoritative: if the title/body/reproduction steps mention bare env names (`dev`, `staging`, `prod`, `production`) or env-bearing URLs (`staging.<domain>`, `gql.staging.*`, `dev.<domain>`), that reported environment wins over a generic autofill default.
|
|
74
|
-
2. **Map the environment to a base branch** via `.lisa.config.json` `deploy.branches` (e.g. `staging → staging`, `production → main`) — the forward direction of the same map the env-keyed `done` resolution uses in reverse (see the `config-resolution` rule). If the work item names **no** environment, the base branch is the **remote default branch** (`gh repo view --json defaultBranchRef -q .defaultBranchRef.name`, or `git remote set-head origin -a` then read `origin/HEAD`). If the reported environment is absent from `deploy.branches`, or its branch does not exist on the remote, **stop and report** — never guess a base and never silently fall back to the default/integration branch.
|
|
74
|
+
2. **Map the environment to a base branch** via `.lisa.config.json` `deploy.branches` (e.g. `staging → staging`, `production → main`) — the forward direction of the same map the env-keyed `done` resolution uses in reverse (see the `config-resolution` rule). If the work item names **no** environment, the base branch is the **remote default branch** (`gh repo view --json defaultBranchRef -q .defaultBranchRef.name`, or `git remote set-head origin -a` then read `origin/HEAD`), and record that fallback assumption in the plan/tracker artifact before proceeding. If the reported environment is absent from `deploy.branches`, or its branch does not exist on the remote, **stop and report** — never guess a base and never silently fall back to the default/integration branch.
|
|
75
75
|
3. **Establish the feature branch off the latest base, conflict-free:**
|
|
76
76
|
- `git fetch origin`.
|
|
77
77
|
- Already on a feature branch with an **open PR** → reuse it. If the PR's base ≠ the resolved base branch, surface the mismatch and re-target only with confirmation — the ticket's environment is the source of truth.
|
|
@@ -1,88 +1,62 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: product-walkthrough
|
|
3
|
-
description: "Methodology for evaluating the live product
|
|
3
|
+
description: "Methodology for evaluating the live product when planning work or evaluating a PRD. Reading a PRD or a mock without seeing the current product produces tickets that misjudge the change — this skill grounds the analysis in what actually exists today. Driving the product is owned by the `use-the-product` core (which detects the product type — DOM web, HTTP/API, canvas game, CLI, IaC — resolves the per-environment mutation policy from .lisa.config.json so production is never mutated by accident, and explores through the project's personas when defined); this skill adds the planning lens. Invoke from notion-to-tracker (Phase 2b live-product walkthrough), jira-create, and any PRD intake flow whose work touches existing user-facing surfaces."
|
|
4
4
|
allowed-tools: ["Skill", "Bash", "Read", "mcp__plugin_playwright_playwright__browser_navigate", "mcp__plugin_playwright_playwright__browser_snapshot", "mcp__plugin_playwright_playwright__browser_take_screenshot", "mcp__plugin_playwright_playwright__browser_click", "mcp__plugin_playwright_playwright__browser_type", "mcp__plugin_playwright_playwright__browser_select_option", "mcp__plugin_playwright_playwright__browser_fill_form", "mcp__plugin_playwright_playwright__browser_press_key", "mcp__plugin_playwright_playwright__browser_hover", "mcp__plugin_playwright_playwright__browser_navigate_back", "mcp__plugin_playwright_playwright__browser_resize", "mcp__plugin_playwright_playwright__browser_tabs", "mcp__plugin_playwright_playwright__browser_console_messages", "mcp__plugin_playwright_playwright__browser_network_requests", "mcp__plugin_playwright_playwright__browser_wait_for", "mcp__plugin_playwright_playwright__browser_close"]
|
|
5
5
|
---
|
|
6
6
|
|
|
7
7
|
# Live Product Walkthrough
|
|
8
8
|
|
|
9
|
-
Reading a PRD or a mock without seeing the current product produces tickets that misjudge the change. This skill defines how to
|
|
9
|
+
Reading a PRD or a mock without seeing the current product produces tickets that misjudge the change. This skill defines how to evaluate the live product *before* planning tickets, so the work is grounded in what actually exists today.
|
|
10
|
+
|
|
11
|
+
**How you drive the product is owned by the `use-the-product` core skill** — it detects the product type (web / API / game / CLI / IaC), resolves the target environment and its **mutation policy** from `.lisa.config.json`, and discovers the project's **personas**. A walkthrough is read-leaning: prefer the policy's **read-only** actions, and only mutate when both the policy allows it (`full`) and a flow genuinely can't be understood without it. This skill adds the **planning lens** below.
|
|
10
12
|
|
|
11
13
|
## When to invoke
|
|
12
14
|
|
|
13
15
|
Always run a walkthrough when the work touches user-facing surfaces:
|
|
14
16
|
|
|
15
17
|
- The PRD describes a change to an existing screen, flow, or interaction
|
|
16
|
-
- The PRD adds something *next to* existing functionality (entry points, navigation, related
|
|
18
|
+
- The PRD adds something *next to* existing functionality (entry points, navigation, related surfaces)
|
|
17
19
|
- A mock or prototype implies a re-style or re-flow of something currently shipped
|
|
18
20
|
- The change is a "bug" framed as a fix to current behavior — you must see the current behavior before reasoning about the fix
|
|
19
21
|
|
|
20
|
-
Skip when the work is purely
|
|
21
|
-
|
|
22
|
-
## Configuration
|
|
23
|
-
|
|
24
|
-
Required inputs (ask if not set):
|
|
25
|
-
|
|
26
|
-
| Variable | Purpose | Example |
|
|
27
|
-
|----------|---------|---------|
|
|
28
|
-
| `E2E_BASE_URL` | Frontend base URL to walk through | `https://dev.example.io/` |
|
|
29
|
-
| Sign-in account | Test user to sign in as for the affected flows | from PRD config / 1Password / env |
|
|
30
|
-
| Sign-in credentials | How to obtain (1Password item, env vars) | `E2E_TEST_PHONE`, `E2E_TEST_OTP` |
|
|
31
|
-
|
|
32
|
-
Walk through `dev` (or the env named in the PRD) — never `prod` for exploratory walkthroughs unless explicitly asked.
|
|
22
|
+
Skip when the work is purely internal (type-only, doc-only) or affects a surface that does not yet exist in production / dev.
|
|
33
23
|
|
|
34
|
-
##
|
|
24
|
+
## 1. Plan the walkthrough
|
|
35
25
|
|
|
36
|
-
|
|
26
|
+
Before driving anything, list the surfaces the change will touch:
|
|
37
27
|
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
- Which screens/routes are involved (current and new)?
|
|
28
|
+
- Which screens/routes/endpoints are involved (current and new)?
|
|
41
29
|
- Which user roles need to be exercised (admin / customer / etc.)?
|
|
42
30
|
- Which states matter (signed-out, signed-in, empty, populated, error, loading)?
|
|
43
|
-
-
|
|
44
|
-
|
|
45
|
-
Write this list down. If you can't, the PRD is too vague — note this as a coverage smell and surface it as an Open Question on the resulting ticket.
|
|
46
|
-
|
|
47
|
-
### 2. Open the browser and sign in
|
|
31
|
+
- For a DOM web app, which viewports matter (desktop always; mobile when responsive)?
|
|
48
32
|
|
|
49
|
-
|
|
50
|
-
2. `browser_resize` to the primary viewport (default desktop 1512×768).
|
|
51
|
-
3. Sign in via the test account. Use `browser_fill_form` and `browser_click`. Capture the post-login screen with `browser_snapshot` or `browser_take_screenshot`.
|
|
33
|
+
Write this list down. If you can't, the PRD is too vague — note it as a coverage smell and surface it as an Open Question on the resulting ticket.
|
|
52
34
|
|
|
53
|
-
|
|
35
|
+
## 2. Drive the current product
|
|
54
36
|
|
|
55
|
-
|
|
37
|
+
**Invoke `use-the-product`** to detect the type, resolve the environment + mutation policy, and discover personas — then drive the surfaces from step 1 through its per-type playbook (browser for DOM, `curl` for an API, canvas+input for a game, `cdk synth`/`diff` for IaC). Capture evidence as you go: for a DOM app, a `browser_snapshot` (accessibility tree — best for reasoning) and a `browser_take_screenshot` (visual) per surface and per state, plus `browser_console_messages` / `browser_network_requests` after interactions; for an API, representative request/response pairs; for a game, screenshots of each state. If the project defines personas, walk the surfaces as the relevant archetype(s).
|
|
56
38
|
|
|
57
|
-
|
|
58
|
-
2. Exercise the relevant interactions. Capture state transitions.
|
|
59
|
-
3. Capture each state that matters (empty, populated, error, loading) — explicitly trigger them where possible.
|
|
60
|
-
4. For responsive changes, `browser_resize` to the secondary viewport (mobile 375×812) and re-capture.
|
|
61
|
-
5. `browser_console_messages` and `browser_network_requests` after each interaction — surface any errors, 4xx/5xx, or unexpected calls.
|
|
39
|
+
Honor the mutation gate: on a `read-only` env, observe without submitting; never walk a `forbidden` env (production defaults to forbidden). Treat console errors, 4xx/5xx, and unexpected calls as findings.
|
|
62
40
|
|
|
63
|
-
|
|
41
|
+
## 3. Record findings
|
|
64
42
|
|
|
65
43
|
For every walkthrough, record:
|
|
66
44
|
|
|
67
|
-
- **What exists today**: a short prose description of the current flow, the components in use (
|
|
68
|
-
- **What the PRD changes**: explicit delta — added
|
|
69
|
-
- **Existing-component reuse candidates**: components in the current product that could absorb the new behavior
|
|
70
|
-
- **Design-vs-current-product divergence**:
|
|
71
|
-
- **Coverage smells**: states the PRD doesn't address that exist today (e.g
|
|
72
|
-
- **Behavioral surprises**: anything that doesn't match the PRD's assumptions about current behavior —
|
|
45
|
+
- **What exists today**: a short prose description of the current flow, the components/endpoints in use (identify them from the snapshot/routes where you can), and the states observed.
|
|
46
|
+
- **What the PRD changes**: explicit delta — added / removed / modified surfaces, new/removed states.
|
|
47
|
+
- **Existing-component reuse candidates**: components or endpoints in the current product that could absorb the new behavior (see `lisa:tracker-source-artifacts` §7).
|
|
48
|
+
- **Design-vs-current-product divergence**: where the mock/prototype materially diverges from what's shipped. Each divergence is a discussion item, not an automatic rebuild (see `lisa:tracker-source-artifacts` §3).
|
|
49
|
+
- **Coverage smells**: states the PRD doesn't address that exist today (e.g. the mock shows the empty state but ignores the populated state 90% of users see).
|
|
50
|
+
- **Behavioral surprises**: anything that doesn't match the PRD's assumptions about current behavior — usually the most valuable findings, because they invalidate parts of the PRD.
|
|
73
51
|
|
|
74
|
-
|
|
52
|
+
## 4. Attach evidence and close
|
|
75
53
|
|
|
76
|
-
Capture
|
|
54
|
+
Capture evidence so the originating ticket / Notion comment / PRD review can reference it. Close the session when done (`browser_close` for a browser) — walkthroughs are short, focused, and one-shot.
|
|
77
55
|
|
|
78
|
-
- For **PRD intake**: include a "Current Product" comment on the Notion PRD with the findings prose and inline screenshots
|
|
79
|
-
- For **ticket creation**: include the findings under `## Current Product` in the ticket description (Story or Epic). Reference
|
|
56
|
+
- For **PRD intake**: include a "Current Product" comment on the Notion PRD with the findings prose and inline screenshots alongside each affected surface.
|
|
57
|
+
- For **ticket creation**: include the findings under `## Current Product` in the ticket description (Story or Epic). Reference screenshots as remote links or attachments.
|
|
80
58
|
- For **change-impact analysis**: produce a short report; the consuming skill decides where it lands.
|
|
81
59
|
|
|
82
|
-
### 6. Close the browser
|
|
83
|
-
|
|
84
|
-
`browser_close` when done. Walkthroughs are short, focused, and one-shot — do not leave a session open across phases.
|
|
85
|
-
|
|
86
60
|
## Findings format
|
|
87
61
|
|
|
88
62
|
Use this structure when emitting walkthrough findings, so consuming skills can splice them into tickets / comments unchanged. The `## Current Product` heading matches what `lisa:jira-write-ticket` Phase 4e expects to inherit — keep the heading exact.
|
|
@@ -90,15 +64,16 @@ Use this structure when emitting walkthrough findings, so consuming skills can s
|
|
|
90
64
|
```text
|
|
91
65
|
## Current Product
|
|
92
66
|
|
|
93
|
-
**Environment**: <
|
|
94
|
-
**
|
|
67
|
+
**Environment**: <target> as <account/role> (<mutation level>)
|
|
68
|
+
**Explored as**: <persona(s) or "generic representative user">
|
|
69
|
+
**Viewports exercised**: Desktop 1512×768, Mobile 375×812 (DOM web only)
|
|
95
70
|
|
|
96
71
|
### Surfaces walked
|
|
97
|
-
1. <route> — <one-line current behavior>
|
|
98
|
-
2. <route> — <one-line current behavior>
|
|
72
|
+
1. <route/endpoint/screen> — <one-line current behavior>
|
|
73
|
+
2. <route/endpoint/screen> — <one-line current behavior>
|
|
99
74
|
|
|
100
75
|
### What exists today
|
|
101
|
-
<2-4 sentence prose summary of the current flow and components in use>
|
|
76
|
+
<2-4 sentence prose summary of the current flow and components/endpoints in use>
|
|
102
77
|
|
|
103
78
|
### Delta vs. PRD
|
|
104
79
|
- ADDED: <new surface/state from PRD>
|
|
@@ -107,23 +82,23 @@ Use this structure when emitting walkthrough findings, so consuming skills can s
|
|
|
107
82
|
- UNCHANGED-BUT-IMPACTED: <existing surface PRD doesn't mention but will be affected>
|
|
108
83
|
|
|
109
84
|
### Existing-component reuse candidates
|
|
110
|
-
- <component
|
|
85
|
+
- <component / endpoint / screen> — could absorb <new behavior>
|
|
111
86
|
|
|
112
87
|
### Design-vs-current-product divergence
|
|
113
|
-
- <mock or prototype reference> diverges from <current
|
|
88
|
+
- <mock or prototype reference> diverges from <current surface> in: <specific dimension>
|
|
114
89
|
- Recommendation: <reuse / new build / discussion>
|
|
115
90
|
|
|
116
91
|
### Coverage smells & behavioral surprises
|
|
117
92
|
- <smell or surprise>
|
|
118
93
|
|
|
119
94
|
### Evidence
|
|
120
|
-
- <list of screenshots/snapshots, with captions>
|
|
95
|
+
- <list of screenshots/snapshots/request-response pairs, with captions>
|
|
121
96
|
```
|
|
122
97
|
|
|
123
98
|
## Rules
|
|
124
99
|
|
|
125
100
|
- Walk before you write. If the work touches existing user-facing surfaces and the walkthrough wasn't done, the resulting ticket is missing context — don't ship it.
|
|
126
|
-
- Never walk `
|
|
101
|
+
- Never walk a `forbidden` environment (production is forbidden by default). Use `dev`/`staging` per the `exploration` config, and default to read-only for a planning walkthrough.
|
|
127
102
|
- Treat console errors and unexpected network calls as findings — they often reveal undocumented behavior the PRD assumes is fine.
|
|
128
103
|
- Findings drive `## Open Questions` on tickets, not silent assumptions. If the current product contradicts the PRD, surface it as a BLOCKER.
|
|
129
|
-
- This skill captures observations; it does not edit
|
|
104
|
+
- This skill captures observations; it does not edit the tracker or the PRD. Consuming skills decide where findings land.
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: use-the-product
|
|
3
|
+
description: 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.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Use the Product
|
|
7
|
+
|
|
8
|
+
## The one idea
|
|
9
|
+
|
|
10
|
+
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).
|
|
11
|
+
|
|
12
|
+
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.
|
|
13
|
+
|
|
14
|
+
## 1. Detect the product type & interface
|
|
15
|
+
|
|
16
|
+
Infer from the repo; if genuinely ambiguous, ask one concise question.
|
|
17
|
+
|
|
18
|
+
| Signals | Type | Consumer-facing interface |
|
|
19
|
+
|---|---|---|
|
|
20
|
+
| `vite`/`next`/`angular`/`svelte` + `index.html`, DOM UI | **DOM web app** | the rendered UI in a real browser |
|
|
21
|
+
| API server (`nest`/`express`/`fastify`/serverless handlers), OpenAPI, no frontend | **HTTP / API backend** | the API endpoints |
|
|
22
|
+
| `phaser`/`pixi`/canvas game | **Canvas game** | the canvas + input (keyboard/pointer), read visually |
|
|
23
|
+
| `cdk.json` / Terraform / IaC | **IaC / CDK** | the resources it provisions (+ synth output) |
|
|
24
|
+
| `bin/` CLI or published library, no server | **CLI / library** | the commands / public API |
|
|
25
|
+
|
|
26
|
+
## 2. Resolve the environment & mutation policy — the gate
|
|
27
|
+
|
|
28
|
+
Read the `exploration` block from `.lisa.config.json` (a repo-local config overrides a global one):
|
|
29
|
+
|
|
30
|
+
```jsonc
|
|
31
|
+
"exploration": {
|
|
32
|
+
"default": "<env-name>", // which env to use when none is passed
|
|
33
|
+
"environments": {
|
|
34
|
+
"<name>": {
|
|
35
|
+
"url": "https://dev.example.io", // web/API target (omit for local CLI/game)
|
|
36
|
+
"provision": true, // IaC/ephemeral: stand up, then tear down
|
|
37
|
+
"mutation": "forbidden | read-only | full",
|
|
38
|
+
"identity": "<test-account ref>", // which login to use (env var / 1Password ref)
|
|
39
|
+
"prodMutationAck": "<one sentence>" // REQUIRED to allow `full` on a production-named env
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
```
|
|
44
|
+
|
|
45
|
+
Resolve the target env: explicit argument → `default` → infer. Then the **mutation level governs everything**:
|
|
46
|
+
|
|
47
|
+
- **`read-only`** — only non-mutating interactions: read endpoints (`GET`), view UI without submitting, `cdk synth`/`diff`, `--help`/dry-run. Never create / edit / delete.
|
|
48
|
+
- **`full`** — create / edit / delete allowed, but **only as the `identity` test account** and under Mutation Discipline (§5).
|
|
49
|
+
- **`forbidden`** — do not exercise this environment at all.
|
|
50
|
+
|
|
51
|
+
**Safety rules — enforced regardless of config:**
|
|
52
|
+
|
|
53
|
+
- **No `exploration` block, or an unconfigured env → treat as `read-only`.** Never mutate without an explicit policy.
|
|
54
|
+
- **A production-named env (`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.
|
|
55
|
+
- **Never sign in as a real user or an admin** — only the `identity` test account.
|
|
56
|
+
- If evaluating something *requires* a mutation the policy forbids, stop at that boundary and report it — never escalate your own permissions.
|
|
57
|
+
|
|
58
|
+
## 3. Discover personas & subagents — soft-detect
|
|
59
|
+
|
|
60
|
+
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).
|
|
61
|
+
|
|
62
|
+
- **Present** → drive the product **through each relevant persona**: adopt the archetype's constraints (device, session length, goals, patience, genre-literacy) and evaluate as them; run each archetype for breadth.
|
|
63
|
+
- **Absent** → drive as a single **generic representative end user** of the app's stated audience, and say so.
|
|
64
|
+
|
|
65
|
+
## 4. Drive the product — per type
|
|
66
|
+
|
|
67
|
+
Apply the interface's *read-only* actions always; the *mutate* actions only when the policy is `full`.
|
|
68
|
+
|
|
69
|
+
- **DOM web app** — a real browser (Playwright MCP). Land cold on the entry page, then click / type / select / submit visible controls and attempt real tasks; sweep viewport widths. *(The caller's lens supplies the specific things to look for.)*
|
|
70
|
+
- **HTTP / API backend** — the consumer is a client, not a browser. Read-only: read the OpenAPI/routes and call safe `GET`s (`curl`/`httpie`). Mutate: exercise representative `POST`/`PUT`/`DELETE` flows with test data as the `identity`; check status codes, payload shapes, and error responses.
|
|
71
|
+
- **Canvas game** — a real browser, but the UI is **drawn to a canvas, not the DOM**. Boot it (e.g. `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.
|
|
72
|
+
- **CLI / library** — the interface is the command / public API. Read-only: `--help`, read-only commands, dry-runs. Mutate: run state-changing commands with disposable inputs.
|
|
73
|
+
- **IaC / CDK** — the "user" is whoever **consumes the resources the stack provisions** (plus the operator). **Read-only (default):** `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.
|
|
74
|
+
|
|
75
|
+
## 5. Mutation Discipline — only when the policy is `full`
|
|
76
|
+
|
|
77
|
+
A real user creates, edits, and deletes things — exercise those flows when, and only when, the policy allows and always as the `identity` account.
|
|
78
|
+
|
|
79
|
+
- Use unique names with a clear prefix such as `qa-` or `codex-`.
|
|
80
|
+
- Before mutating, identify the cleanup path. After mutating, make a best effort to clean up, then verify it. If cleanup is unavailable, that itself is a finding.
|
|
81
|
+
- Avoid destructive bulk actions unless the account/data is clearly disposable.
|
|
82
|
+
- Record every mutation performed, cleanup attempts, and any residue left behind.
|
|
83
|
+
|
|
84
|
+
## What you return
|
|
85
|
+
|
|
86
|
+
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.
|
|
@@ -4,4 +4,4 @@ allowed-tools: ["Skill"]
|
|
|
4
4
|
argument-hint: "[target-url | env] [ready=true|false]"
|
|
5
5
|
---
|
|
6
6
|
|
|
7
|
-
Use the /lisa-expo:e2e-coverage-gaps skill to inventory the app's routes and the existing Playwright suite, find uncovered and happy-path-only paths, confirm each gap in the running app, and file one build-ready missing-test ticket per gap via lisa:tracker-write (build-ready per the ready flag, default true). For human usability/experience findings, use /lisa
|
|
7
|
+
Use the /lisa-expo:e2e-coverage-gaps skill to inventory the app's routes and the existing Playwright suite, find uncovered and happy-path-only paths, confirm each gap in the running app, and file one build-ready missing-test ticket per gap via lisa:tracker-write (build-ready per the ready flag, default true). For human usability/experience findings, use /lisa:exploratory-qa. $ARGUMENTS
|