@codyswann/lisa 2.187.4 → 2.188.1
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/commands/exploratory-qa.md +7 -0
- 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/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/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/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/commands/exploratory-qa.md +7 -0
- package/plugins/lisa-copilot/skills/exploratory-qa/SKILL.md +91 -0
- 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/commands/exploratory-qa.md +7 -0
- package/plugins/lisa-cursor/skills/exploratory-qa/SKILL.md +91 -0
- 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/commands/exploratory-qa.md +7 -0
- package/plugins/src/base/skills/exploratory-qa/SKILL.md +91 -0
- 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
|
@@ -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
|
|
@@ -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-harper-fabric: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-harper-fabric: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
|
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
description: "Run a first-time-user exploratory QA walkthrough: experience the app like a brand-new human user in a real browser or browser automation session, clicking/typing/selecting through visible controls to find anything confusing, broken, or hard to understand (human-facing jargon, contextless extracted data, machine-style labels, slow or unclear loads, late meaningful content, cramped or cut-off UI, inconsistent UX, awkward scroll behavior) across all breakpoints, and file 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 Playwright suite, use e2e-coverage-gaps instead."
|
|
3
|
-
allowed-tools: ["Skill"]
|
|
4
|
-
argument-hint: "[target-url | env] [ready=true|false]"
|
|
5
|
-
---
|
|
6
|
-
|
|
7
|
-
Use the /lisa-expo:exploratory-qa skill to experience the app like a brand-new first-time user in a real browser or browser automation session — landing cold on the home page, clicking/typing/selecting through visible controls, and verifying resulting UI state across all breakpoints — and file 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 Playwright coverage gaps, use /lisa-expo:e2e-coverage-gaps. $ARGUMENTS
|
|
@@ -1,264 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
name: exploratory-qa
|
|
3
|
-
description: First-time-user exploratory QA walkthrough for web apps that FEEDS THE LIFECYCLE. Use when asked to experience an app the way a brand-new human user would — opening it in a real browser or browser automation session, landing cold on the home page, and clicking/typing/selecting through visible controls to find anything confusing, broken, or hard to understand (unclear purpose or audience, human-facing jargon, contextless extracted data, machine-style labels, raw dates/enums, sparse data with no explanation, wrong control semantics, slow or unclear loads, late meaningful content, cramped or cut-off UI, inconsistent/non-standard UX, awkward scroll behavior, unclear affordances, dead-end flows that strand a user — e.g. a login page with no way to register or recover a password, or a primary action that drops the user into an incomplete/unsatisfiable state with no way to finish) across all breakpoints. Static route scans, HTTP fetches, screenshots alone, or console/network checks alone are not sufficient exploratory QA evidence. Instead of writing a report file, it files every finding as a tracked work item via lisa:tracker-write (bugs and usability/UX issues). 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 Playwright test suite, use the e2e-coverage-gaps skill instead.
|
|
4
|
-
---
|
|
5
|
-
|
|
6
|
-
# Exploratory QA
|
|
7
|
-
|
|
8
|
-
## Overview
|
|
9
|
-
|
|
10
|
-
Experience the app the way a **brand-new human user** would: open it in a real browser or browser
|
|
11
|
-
automation tool, land cold on the home page with no prior knowledge, then click through and actually
|
|
12
|
-
try to use it — just like a real person. The goal is to surface anything **confusing, broken, or hard
|
|
13
|
-
to understand**, and to do so at **every breakpoint**.
|
|
14
|
-
|
|
15
|
-
This is a usability/experience pass, **not** a test-coverage audit. It does not look at the Playwright
|
|
16
|
-
suite or hunt for coverage gaps — for that, use the `e2e-coverage-gaps` skill. Here, every finding is
|
|
17
|
-
filed as a tracked work item so it enters the Lisa lifecycle — no static report file. Static route
|
|
18
|
-
scans, HTTP fetches, screenshots alone, and console/network checks alone do not count as exploratory
|
|
19
|
-
QA evidence because they do not prove a person could use the visible UI.
|
|
20
|
-
|
|
21
|
-
## Parameters
|
|
22
|
-
|
|
23
|
-
- **`target-url | env`** (first positional) — what to explore.
|
|
24
|
-
- **`ready=true|false`** — the build-ready state for the tickets this pass creates.
|
|
25
|
-
- `ready=true` → created build-ready, so `lisa:intake` / the build-intake scanner auto-picks them up.
|
|
26
|
-
- `ready=false` (**default**) → created in the backlog (not build-ready) for a human to review and
|
|
27
|
-
promote into the queue.
|
|
28
|
-
|
|
29
|
-
## Core Workflow
|
|
30
|
-
|
|
31
|
-
### 1. Establish Scope
|
|
32
|
-
|
|
33
|
-
- Identify the target environment, account type, and browser requirement, and read the `ready` flag
|
|
34
|
-
(default `false`).
|
|
35
|
-
- Open the target in a real browser or browser automation tool before drawing conclusions. Use static
|
|
36
|
-
code inspection, route lists, network/console logs, and screenshots only as supporting evidence, not
|
|
37
|
-
as a substitute for live browser interaction.
|
|
38
|
-
- **Confirm the tracker is configured.** Findings are filed as tickets, so read `tracker` from
|
|
39
|
-
`.lisa.config.json` (local overrides global). If it is unset, stop and report that the tracker must
|
|
40
|
-
be configured (via `/lisa:setup:jira` / `:github` / `:linear`) before exploratory QA can file
|
|
41
|
-
findings — do not silently fall back to a report file.
|
|
42
|
-
- If credentials, tenant, or seed data are missing and cannot be discovered safely, ask one concise
|
|
43
|
-
clarifying question.
|
|
44
|
-
- Treat production-like environments conservatively. Do not mutate production data unless the user
|
|
45
|
-
explicitly approves it. Prefer a test user, dev/staging environment, or isolated seeded account.
|
|
46
|
-
|
|
47
|
-
### 2. Arrive Cold
|
|
48
|
-
|
|
49
|
-
- Start at the home/landing page with **no prior knowledge of the app**. Do **not** pre-read the
|
|
50
|
-
codebase to learn the intended flows — discover them the way a user would, by looking and clicking.
|
|
51
|
-
- Form a first impression: is it obvious what this app is, what to do first, and where to go next?
|
|
52
|
-
- On each major page, ask what a cold user would think the page is trying to do or tell them. If the
|
|
53
|
-
page could plausibly be read as several different products or workflows (public browser vs admin
|
|
54
|
-
workbench vs data-quality dashboard vs review queue), file a clarity/usability ticket.
|
|
55
|
-
|
|
56
|
-
### 3. Use It Like a Human
|
|
57
|
-
|
|
58
|
-
Click through the visible paths and actually attempt real tasks in the browser — a first-time user
|
|
59
|
-
explores, makes mistakes, and tries the obvious thing. When a page exposes forms, filters, menus,
|
|
60
|
-
links, buttons, selects, tabs, or other visible controls, click, type, select, submit, clear,
|
|
61
|
-
navigate, and otherwise exercise representative controls when safe; then verify the resulting UI or
|
|
62
|
-
data state in the browser. Cover at least these dimensions unless the user narrows scope:
|
|
63
|
-
|
|
64
|
-
- **Comprehension & labeling:** human-facing copy must sound like something a normal first-time user
|
|
65
|
-
would understand. Flag machine-style or developer labels shown to users (raw IDs, enum keys,
|
|
66
|
-
`snake_case`, `null`/`undefined`, untranslated i18n keys), admin/database terms such as
|
|
67
|
-
"metadata", "rows", "bucket", "record", "entity", or "loaded rows", implementation identifiers such
|
|
68
|
-
as slugs, unexplained domain jargon, unclear button/menu names, and icons with no discernible
|
|
69
|
-
meaning. Flag all-caps enum/source labels, raw timestamps, and typo-like machine strings. If a
|
|
70
|
-
heading, label, or field would make a non-technical user ask "what does that mean?", file a
|
|
71
|
-
usability/clarity ticket with plainer wording.
|
|
72
|
-
- **Data usefulness & context:** extracted facts, metrics, summaries, and structured tables must help
|
|
73
|
-
a person understand the surface. Flag machine residue that only proves extraction happened, such as
|
|
74
|
-
repeated generic fields (`Money Mention`, `Entity`, `Record`) paired with values but no sentence,
|
|
75
|
-
source, category, or explanation of why the value matters. If a user cannot tell what a number,
|
|
76
|
-
fact, or field refers to without rereading the raw source, file a usability/clarity ticket to hide it
|
|
77
|
-
from the default UI or add context such as excerpts, labels, grouping, or provenance.
|
|
78
|
-
- **Data volume and trust:** compare the amount of visible data to what the page promises. A rich
|
|
79
|
-
explorer, dashboard, or workbench with only a few rows/items can look broken, filtered, still
|
|
80
|
-
loading, sample-only, or untrusted. File a finding when sparse data is not explicitly explained with
|
|
81
|
-
result counts, active filters, reset affordances, ingestion/coverage status, or sample/demo labeling.
|
|
82
|
-
- **Dates, numbers, and source metadata:** normal product UI should not expose storage formats unless
|
|
83
|
-
it is intentionally a technical log. Flag ISO timestamps, inconsistent relative/absolute date
|
|
84
|
-
styles, unexplained generated/imported/loaded dates, raw score/null states, and source metadata that
|
|
85
|
-
does not explain what was sourced, when, and why it matters.
|
|
86
|
-
- **Controls and mental model:** controls must match what they do. Sort is not a filter; search is not
|
|
87
|
-
a facet; finite data domains usually need selects/typeaheads rather than blank text inputs. Flag
|
|
88
|
-
controls that make users guess exact spelling/casing, hide the available option universe, mix
|
|
89
|
-
filtering with sorting/view settings, or use the wrong component for the task.
|
|
90
|
-
- **Information hierarchy and panel value:** scan cards, sidebars, workbenches, summaries, and metric
|
|
91
|
-
tiles for whether they communicate anything useful at a glance. File findings for blank-looking
|
|
92
|
-
panels, repeated cards with unclear labels, counts without named subjects, decorative summaries that
|
|
93
|
-
consume more attention than the primary workflow, or duplicated navigation that squeezes the actual
|
|
94
|
-
task area.
|
|
95
|
-
- **Navigation clarity:** is it obvious how to get somewhere and back? Dead ends, hidden entry points,
|
|
96
|
-
surprising redirects, broken links, no clear "home". Flag duplicated nav regions that compete for
|
|
97
|
-
space without adding page-specific value, and icon systems that degrade into raw punctuation or mix
|
|
98
|
-
unrelated visual languages.
|
|
99
|
-
- **Flow completeness & expected counterparts:** a screen that gates access or shows one side of a
|
|
100
|
-
standard paired flow must offer the other side — or a clear path to it. A brand-new user must never
|
|
101
|
-
hit a dead end with no next step. Flag missing companion actions, especially on auth and entry
|
|
102
|
-
screens:
|
|
103
|
-
- **Sign-in with no sign-up:** a login page with no "Create account" / "Register" link strands
|
|
104
|
-
anyone who does not already have an account; likewise a registration page with no link back to
|
|
105
|
-
sign in.
|
|
106
|
-
- **No account recovery:** login with no "Forgot password?", no way to reset, and no way to resend a
|
|
107
|
-
verification email.
|
|
108
|
-
- **No exit from a state:** a signed-in app with no visible sign-out, or a modal / wizard / detail
|
|
109
|
-
view with no back, close, or cancel.
|
|
110
|
-
- **One-way actions:** create/add with no matching edit or delete (or the reverse) where a user
|
|
111
|
-
would reasonably expect both.
|
|
112
|
-
- **Unreachable entry points:** a feature only reachable by guessing a URL, or an empty state with
|
|
113
|
-
no primary action to populate it.
|
|
114
|
-
When the missing counterpart makes a core task impossible for a whole class of users (e.g. a new
|
|
115
|
-
user literally cannot create an account), file a `Bug`; otherwise file a usability `Improvement`.
|
|
116
|
-
- **Action preconditions & incomplete end-states:** an action whose result only makes sense with
|
|
117
|
-
multiple inputs (compare, merge, combine, bulk-edit) or with some prerequisite met should guide the
|
|
118
|
-
user to satisfy that precondition — by disabling/explaining it until it is met, by collecting the
|
|
119
|
-
inputs first (e.g. a selection tray), or by giving the destination an obvious in-place control to
|
|
120
|
-
complete it. Actually trigger these actions and watch where they land; flag when a primary action:
|
|
121
|
-
- **Fires under-satisfied and strands the user:** e.g. a per-row "Compare" that navigates to a
|
|
122
|
-
comparison of a single item, shows an "under limit / add at least 2" notice, but exposes no
|
|
123
|
-
visible "add another" control — the user is told what is wrong with no in-place means to fix it.
|
|
124
|
-
- **Lands on an incomplete / empty end-state with no next step:** a results or detail screen that
|
|
125
|
-
announces it is empty, partial, or "needs more" yet offers no affordance to add, retry, or return
|
|
126
|
-
to the selection that produced it.
|
|
127
|
-
- **Is offered where it cannot succeed:** a multi-item action exposed on a single item, or an action
|
|
128
|
-
left enabled while its precondition (a selection, a minimum count, a required field) is unmet,
|
|
129
|
-
with no explanation.
|
|
130
|
-
When the user is left unable to complete the action they started, file a `Bug`; when it eventually
|
|
131
|
-
works but the path is confusing or roundabout, file a usability `Improvement`.
|
|
132
|
-
- **Visual/layout quality:** cut-off or truncated text, overlap, cramped/crowded density, offscreen or
|
|
133
|
-
unreachable controls, accidental horizontal scroll, awkward empty space. **Do not judge this by
|
|
134
|
-
eyeballing a screenshot alone** — a control clipped by a few pixels or pushed just past a container
|
|
135
|
-
edge looks fine in a thumbnail. Confirm it with the programmatic layout-integrity sweep in §5 at
|
|
136
|
-
every width.
|
|
137
|
-
- **Consistency / standard UX:** components, spacing, button styles, terminology, and interaction
|
|
138
|
-
patterns should be consistent across the app and follow common conventions. Flag anything
|
|
139
|
-
non-standard or that differs screen-to-screen.
|
|
140
|
-
- **Load & responsiveness:** long or unclear load times, blank screens, skeleton-only shells, spinners
|
|
141
|
-
/ `Loading...` / `Connecting...` with no progress, anything that feels slow or janky. Flag pages
|
|
142
|
-
where the browser reports `loaded` / `complete` but meaningful content arrives much later, or where
|
|
143
|
-
the visible shell appears quickly while the real task content remains missing. Capture user-perceived
|
|
144
|
-
timings: shell visible, first meaningful content, and stable/complete content. If the delay is
|
|
145
|
-
noticeable, file a usability/performance ticket even if the eventual content is correct.
|
|
146
|
-
- **Scroll behavior:** unexpected scroll position, scroll jumps, nested or locked scroll, sticky
|
|
147
|
-
elements that cover content, content that cannot be reached.
|
|
148
|
-
- **Behavior correctness:** does the obvious action do what a user expects? Confusing errors, silent
|
|
149
|
-
failures, disabled controls with no explanation, state that does not persist.
|
|
150
|
-
- **Affordance clarity:** can the user tell what is clickable, required, in-progress, or complete?
|
|
151
|
-
|
|
152
|
-
### 4. Cover All Breakpoints
|
|
153
|
-
|
|
154
|
-
- Discover breakpoints from the app (design tokens, CSS, responsive layout changes) when possible; if
|
|
155
|
-
unknown, use a practical baseline: phone, tablet/narrow, desktop, plus any app-specific cutoff.
|
|
156
|
-
- **Do not test only the named breakpoints.** Clipping and overflow most often appear at the
|
|
157
|
-
*in-between* widths — where a row can no longer fit its contents but has not yet collapsed to the
|
|
158
|
-
next layout. Sweep a range of widths (e.g. 360, 390, 414, 600, 768, 834, 1024, 1280, 1440) plus a
|
|
159
|
-
few intermediate steps (e.g. ~900–1180) and re-check the key paths at each.
|
|
160
|
-
- At each width, walk the key paths again and confirm the experience holds: expected
|
|
161
|
-
shell/navigation variant, critical controls visible and reachable, no unintended horizontal
|
|
162
|
-
overflow, intentional scroll containers still usable, nothing cut off or crowded.
|
|
163
|
-
|
|
164
|
-
### 5. Run Layout-Integrity Checks — Don't Eyeball Alone
|
|
165
|
-
|
|
166
|
-
A screenshot glance misses controls clipped by a few pixels or pushed just past a container edge. At
|
|
167
|
-
**every width**, in addition to looking, take DOM measurements via the browser automation tool
|
|
168
|
-
(Playwright, Chrome MCP, etc.) and treat any of these as a finding:
|
|
169
|
-
|
|
170
|
-
- **Document / container overflow:** `document.documentElement.scrollWidth > clientWidth`, or a
|
|
171
|
-
horizontal scrollbar on a container that should not scroll → accidental horizontal overflow.
|
|
172
|
-
- **Clipped or offscreen controls:** for every interactive control (buttons, links, inputs, selects,
|
|
173
|
-
menu items), compare its `getBoundingClientRect()` against the viewport and against each ancestor
|
|
174
|
-
that has `overflow: hidden | clip | auto | scroll`. If any edge of the control falls outside those
|
|
175
|
-
bounds, it is partially or fully clipped / unreachable — even when the page looks fine in a thumbnail.
|
|
176
|
-
This is exactly the case that gets missed: a submit/apply button whose right edge is cut off by its
|
|
177
|
-
filter card.
|
|
178
|
-
- **Truncated meaningful text:** an element whose `scrollWidth > clientWidth` (or that renders an
|
|
179
|
-
ellipsis) where the hidden text carries meaning — e.g. a select showing "Any CRD state" jammed into
|
|
180
|
-
its chevron, a label cut mid-word.
|
|
181
|
-
- **Colliding controls:** a label or value overlapping an adjacent control (icon, chevron, button)
|
|
182
|
-
with no gap between them.
|
|
183
|
-
|
|
184
|
-
Record which width(s) trigger each, the offending element, and a screenshot. **A primary or
|
|
185
|
-
interactive control that is clipped, offscreen, or unreachable is a `Bug`, not merely an
|
|
186
|
-
Improvement** — a user literally cannot see or click all of it.
|
|
187
|
-
|
|
188
|
-
### 6. Watch Load & Latency
|
|
189
|
-
|
|
190
|
-
- Measure separate milestones: visible app shell, `document.readyState`, first meaningful
|
|
191
|
-
route-specific content, and visually stable/full route content.
|
|
192
|
-
- Do not treat a visible shell, completed document, or technically clickable page as loaded if the
|
|
193
|
-
route is still blank, skeleton-only, placeholder-only, or waiting for primary data.
|
|
194
|
-
- Treat skeleton-only/placeholder-only screens as loading states. If they persist for a noticeable
|
|
195
|
-
delay, they need clear progress/loading messaging that explains what is happening.
|
|
196
|
-
- Treat long waits to meaningful content or stable/full content without clear progress, error, retry,
|
|
197
|
-
or cancellation as findings. Use practical labels (noticeable, slow, unacceptable) and include
|
|
198
|
-
observed durations when available.
|
|
199
|
-
|
|
200
|
-
## Mutation Discipline
|
|
201
|
-
|
|
202
|
-
A real first-time user creates, edits, and deletes things — exercise those flows when the environment
|
|
203
|
-
is safe.
|
|
204
|
-
|
|
205
|
-
- Use unique names with a clear prefix such as `qa-` or `codex-`.
|
|
206
|
-
- Before mutating, identify the cleanup path. After mutating, make a best effort to clean up through
|
|
207
|
-
the UI, then verify cleanup. If UI cleanup is unavailable, that itself is a usability finding.
|
|
208
|
-
- Avoid destructive bulk actions unless the user explicitly asks or the account is clearly disposable.
|
|
209
|
-
- Record all mutations performed, cleanup attempts, and any residue left behind.
|
|
210
|
-
|
|
211
|
-
## Filing findings as tracked work
|
|
212
|
-
|
|
213
|
-
This skill does **not** write a report file. Every finding becomes a **leaf work item** created via
|
|
214
|
-
`lisa:tracker-write` (the vendor-neutral writer — it dispatches to the configured tracker and runs the
|
|
215
|
-
validation gate; never call a vendor `*-write-*` skill directly). Map each finding to a type:
|
|
216
|
-
|
|
217
|
-
| Finding | `issue_type` | `build_ready` |
|
|
218
|
-
|---------|--------------|---------------|
|
|
219
|
-
| User-visible **bug** (broken behavior) | `Bug` | the `ready` flag (default `false`) |
|
|
220
|
-
| **Usability / UX / clarity issue** | `Improvement` | the `ready` flag (default `false`) |
|
|
221
|
-
|
|
222
|
-
A control that is **clipped, offscreen, or otherwise unreachable** (per §5) counts as broken behavior
|
|
223
|
-
→ file it as a `Bug`, not an `Improvement`. Pure crowding/clarity with the control still fully usable
|
|
224
|
-
is an `Improvement`.
|
|
225
|
-
|
|
226
|
-
Each finding is a flat leaf (no children), so `build_ready` applies directly — pass it explicitly on
|
|
227
|
-
every create. Each ticket MUST be a complete spec (the validator rejects thin tickets):
|
|
228
|
-
|
|
229
|
-
- **Three-audience description** (context / business value, technical approach, stakeholder impact).
|
|
230
|
-
- **For a bug:** exact reproduction steps, observed-vs-expected, the env / account / breakpoint it
|
|
231
|
-
occurred at, and console/network evidence.
|
|
232
|
-
- **For a usability issue:** the observed friction (what was confusing, cramped, inconsistent, or hard
|
|
233
|
-
to understand), who it affects, **where** (route + breakpoint), and the proposed improvement.
|
|
234
|
-
- **Gherkin acceptance criteria** describing the fixed behavior.
|
|
235
|
-
|
|
236
|
-
### Idempotency — don't spam duplicates
|
|
237
|
-
|
|
238
|
-
Re-running a pass must not refile the same finding. Before creating a ticket, search the tracker for an
|
|
239
|
-
**open** ticket carrying a stable marker `[lisa-exploratory-qa] <finding-key>` in its body (the
|
|
240
|
-
`<finding-key>` is a stable slug of surface + symptom, e.g. `settings-modal/horizontal-overflow@tablet`).
|
|
241
|
-
If one exists, reference/update it instead of creating a duplicate; only create when none exists.
|
|
242
|
-
**Match by the marker, never by title** (titles get edited). A *closed* prior ticket does not suppress a
|
|
243
|
-
new one — a recurrence after a fix is a genuine regression.
|
|
244
|
-
|
|
245
|
-
## Output
|
|
246
|
-
|
|
247
|
-
No report file. Emit a concise in-session summary:
|
|
248
|
-
|
|
249
|
-
- **Scope:** target URL/env, browser/tool, account type, build/version if visible, date.
|
|
250
|
-
- **First impression:** could a new user tell what the app is and what to do first?
|
|
251
|
-
- **Findings filed**, bucketed by type — bugs, usability/clarity issues — each with its **created or
|
|
252
|
-
referenced ticket ref** and its **build-ready state** (`ready` vs `triage/backlog`).
|
|
253
|
-
- **Observed but not filed:** anything noticed but intentionally not ticketed, with why.
|
|
254
|
-
|
|
255
|
-
## Quality Bar
|
|
256
|
-
|
|
257
|
-
- Explore as a true first-time user — judge clarity, not whether you (who can read the code) can figure
|
|
258
|
-
it out.
|
|
259
|
-
- Prefer concrete, reproducible findings. Every ticket must stand alone for an implementer who was not
|
|
260
|
-
in the session.
|
|
261
|
-
- Do not claim cleanup succeeded unless verified.
|
|
262
|
-
- File tickets per the `ready` flag (default: backlog for human triage).
|
|
263
|
-
- This skill is about the human experience only — route automated-coverage gaps to `e2e-coverage-gaps`.
|
|
264
|
-
- Preserve unrelated repo changes.
|
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
description: "Run a first-time-user exploratory QA walkthrough: experience the app like a brand-new human user in a real browser or browser automation session, clicking/typing/selecting through visible controls to find anything confusing, broken, or hard to understand (human-facing jargon, contextless extracted data, machine-style labels, slow or unclear loads, late meaningful content, cramped or cut-off UI, inconsistent UX, awkward scroll behavior) across all breakpoints, and file 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 Playwright suite, use e2e-coverage-gaps instead."
|
|
3
|
-
allowed-tools: ["Skill"]
|
|
4
|
-
argument-hint: "[target-url | env] [ready=true|false]"
|
|
5
|
-
---
|
|
6
|
-
|
|
7
|
-
Use the /lisa-expo:exploratory-qa skill to experience the app like a brand-new first-time user in a real browser or browser automation session — landing cold on the home page, clicking/typing/selecting through visible controls, and verifying resulting UI state across all breakpoints — and file 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 Playwright coverage gaps, use /lisa-expo:e2e-coverage-gaps. $ARGUMENTS
|