@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.
Files changed (154) hide show
  1. package/package.json +1 -1
  2. package/plugins/lisa/.claude-plugin/plugin.json +1 -1
  3. package/plugins/lisa/.codex-plugin/plugin.json +1 -1
  4. package/plugins/lisa/agents/github-agent.md +1 -1
  5. package/plugins/lisa/agents/jira-agent.md +1 -1
  6. package/plugins/lisa/agents/linear-agent.md +1 -1
  7. package/plugins/lisa/commands/exploratory-qa.md +7 -0
  8. package/plugins/lisa/rules/eager/pre-flight-autofill.md +1 -1
  9. package/plugins/lisa/rules/reference/config-resolution.md +4 -3
  10. package/plugins/lisa/rules/reference/pre-flight-autofill.md +3 -3
  11. package/plugins/lisa/skills/exploratory-qa/SKILL.md +91 -0
  12. package/plugins/lisa/skills/exploratory-qa/agents/openai.yaml +4 -0
  13. package/plugins/lisa/skills/implement/SKILL.md +1 -1
  14. package/plugins/lisa/skills/product-walkthrough/SKILL.md +36 -61
  15. package/plugins/lisa/skills/product-walkthrough/agents/openai.yaml +2 -2
  16. package/plugins/lisa/skills/use-the-product/SKILL.md +86 -0
  17. package/plugins/lisa/skills/use-the-product/agents/openai.yaml +4 -0
  18. package/plugins/lisa-agy/agents/github-agent.md +1 -1
  19. package/plugins/lisa-agy/agents/jira-agent.md +1 -1
  20. package/plugins/lisa-agy/agents/linear-agent.md +1 -1
  21. package/plugins/lisa-agy/commands/exploratory-qa.md +7 -0
  22. package/plugins/lisa-agy/plugin.json +1 -1
  23. package/plugins/lisa-agy/skills/exploratory-qa/SKILL.md +91 -0
  24. package/plugins/lisa-agy/skills/implement/SKILL.md +1 -1
  25. package/plugins/lisa-agy/skills/product-walkthrough/SKILL.md +36 -61
  26. package/plugins/lisa-agy/skills/use-the-product/SKILL.md +86 -0
  27. package/plugins/lisa-cdk/.claude-plugin/plugin.json +1 -1
  28. package/plugins/lisa-cdk/.codex-plugin/plugin.json +1 -1
  29. package/plugins/lisa-cdk-agy/plugin.json +1 -1
  30. package/plugins/lisa-cdk-copilot/.claude-plugin/plugin.json +1 -1
  31. package/plugins/lisa-cdk-cursor/.claude-plugin/plugin.json +1 -1
  32. package/plugins/lisa-copilot/.claude-plugin/plugin.json +1 -1
  33. package/plugins/lisa-copilot/agents/github-agent.agent.md +1 -1
  34. package/plugins/lisa-copilot/agents/jira-agent.agent.md +1 -1
  35. package/plugins/lisa-copilot/agents/linear-agent.agent.md +1 -1
  36. package/plugins/lisa-copilot/commands/exploratory-qa.md +7 -0
  37. package/plugins/lisa-copilot/rules/eager/pre-flight-autofill.md +1 -1
  38. package/plugins/lisa-copilot/rules/reference/config-resolution.md +4 -3
  39. package/plugins/lisa-copilot/rules/reference/pre-flight-autofill.md +3 -3
  40. package/plugins/lisa-copilot/skills/exploratory-qa/SKILL.md +91 -0
  41. package/plugins/lisa-copilot/skills/implement/SKILL.md +1 -1
  42. package/plugins/lisa-copilot/skills/product-walkthrough/SKILL.md +36 -61
  43. package/plugins/lisa-copilot/skills/use-the-product/SKILL.md +86 -0
  44. package/plugins/lisa-cursor/.claude-plugin/plugin.json +1 -1
  45. package/plugins/lisa-cursor/agents/github-agent.md +1 -1
  46. package/plugins/lisa-cursor/agents/jira-agent.md +1 -1
  47. package/plugins/lisa-cursor/agents/linear-agent.md +1 -1
  48. package/plugins/lisa-cursor/commands/exploratory-qa.md +7 -0
  49. package/plugins/lisa-cursor/rules/config-resolution-reference.mdc +4 -3
  50. package/plugins/lisa-cursor/rules/pre-flight-autofill-reference.mdc +3 -3
  51. package/plugins/lisa-cursor/rules/pre-flight-autofill.mdc +1 -1
  52. package/plugins/lisa-cursor/skills/exploratory-qa/SKILL.md +91 -0
  53. package/plugins/lisa-cursor/skills/implement/SKILL.md +1 -1
  54. package/plugins/lisa-cursor/skills/product-walkthrough/SKILL.md +36 -61
  55. package/plugins/lisa-cursor/skills/use-the-product/SKILL.md +86 -0
  56. package/plugins/lisa-expo/.claude-plugin/plugin.json +1 -1
  57. package/plugins/lisa-expo/.codex-plugin/plugin.json +1 -1
  58. package/plugins/lisa-expo/commands/e2e-coverage-gaps.md +1 -1
  59. package/plugins/lisa-expo-agy/commands/e2e-coverage-gaps.md +1 -1
  60. package/plugins/lisa-expo-agy/plugin.json +1 -1
  61. package/plugins/lisa-expo-copilot/.claude-plugin/plugin.json +1 -1
  62. package/plugins/lisa-expo-copilot/commands/e2e-coverage-gaps.md +1 -1
  63. package/plugins/lisa-expo-cursor/.claude-plugin/plugin.json +1 -1
  64. package/plugins/lisa-expo-cursor/commands/e2e-coverage-gaps.md +1 -1
  65. package/plugins/lisa-harper-fabric/.claude-plugin/plugin.json +1 -1
  66. package/plugins/lisa-harper-fabric/.codex-plugin/plugin.json +1 -1
  67. package/plugins/lisa-harper-fabric/commands/e2e-coverage-gaps.md +1 -1
  68. package/plugins/lisa-harper-fabric-agy/commands/e2e-coverage-gaps.md +1 -1
  69. package/plugins/lisa-harper-fabric-agy/plugin.json +1 -1
  70. package/plugins/lisa-harper-fabric-copilot/.claude-plugin/plugin.json +1 -1
  71. package/plugins/lisa-harper-fabric-copilot/commands/e2e-coverage-gaps.md +1 -1
  72. package/plugins/lisa-harper-fabric-cursor/.claude-plugin/plugin.json +1 -1
  73. package/plugins/lisa-harper-fabric-cursor/commands/e2e-coverage-gaps.md +1 -1
  74. package/plugins/lisa-nestjs/.claude-plugin/plugin.json +1 -1
  75. package/plugins/lisa-nestjs/.codex-plugin/plugin.json +1 -1
  76. package/plugins/lisa-nestjs-agy/plugin.json +1 -1
  77. package/plugins/lisa-nestjs-copilot/.claude-plugin/plugin.json +1 -1
  78. package/plugins/lisa-nestjs-cursor/.claude-plugin/plugin.json +1 -1
  79. package/plugins/lisa-openclaw/.claude-plugin/plugin.json +1 -1
  80. package/plugins/lisa-openclaw/.codex-plugin/plugin.json +1 -1
  81. package/plugins/lisa-openclaw-agy/plugin.json +1 -1
  82. package/plugins/lisa-openclaw-copilot/.claude-plugin/plugin.json +1 -1
  83. package/plugins/lisa-openclaw-cursor/.claude-plugin/plugin.json +1 -1
  84. package/plugins/lisa-phaser/.claude-plugin/plugin.json +1 -1
  85. package/plugins/lisa-phaser/.codex-plugin/plugin.json +1 -1
  86. package/plugins/lisa-phaser-agy/plugin.json +1 -1
  87. package/plugins/lisa-phaser-copilot/.claude-plugin/plugin.json +1 -1
  88. package/plugins/lisa-phaser-cursor/.claude-plugin/plugin.json +1 -1
  89. package/plugins/lisa-rails/.claude-plugin/plugin.json +1 -1
  90. package/plugins/lisa-rails/.codex-plugin/plugin.json +1 -1
  91. package/plugins/lisa-rails/commands/e2e-coverage-gaps.md +1 -1
  92. package/plugins/lisa-rails-agy/commands/e2e-coverage-gaps.md +1 -1
  93. package/plugins/lisa-rails-agy/plugin.json +1 -1
  94. package/plugins/lisa-rails-copilot/.claude-plugin/plugin.json +1 -1
  95. package/plugins/lisa-rails-copilot/commands/e2e-coverage-gaps.md +1 -1
  96. package/plugins/lisa-rails-cursor/.claude-plugin/plugin.json +1 -1
  97. package/plugins/lisa-rails-cursor/commands/e2e-coverage-gaps.md +1 -1
  98. package/plugins/lisa-typescript/.claude-plugin/plugin.json +1 -1
  99. package/plugins/lisa-typescript/.codex-plugin/plugin.json +1 -1
  100. package/plugins/lisa-typescript-agy/plugin.json +1 -1
  101. package/plugins/lisa-typescript-copilot/.claude-plugin/plugin.json +1 -1
  102. package/plugins/lisa-typescript-cursor/.claude-plugin/plugin.json +1 -1
  103. package/plugins/lisa-wiki/.claude-plugin/plugin.json +1 -1
  104. package/plugins/lisa-wiki/.codex-plugin/plugin.json +1 -1
  105. package/plugins/lisa-wiki-agy/plugin.json +1 -1
  106. package/plugins/lisa-wiki-copilot/.claude-plugin/plugin.json +1 -1
  107. package/plugins/lisa-wiki-cursor/.claude-plugin/plugin.json +1 -1
  108. package/plugins/src/base/agents/github-agent.md +1 -1
  109. package/plugins/src/base/agents/jira-agent.md +1 -1
  110. package/plugins/src/base/agents/linear-agent.md +1 -1
  111. package/plugins/src/base/commands/exploratory-qa.md +7 -0
  112. package/plugins/src/base/rules/eager/pre-flight-autofill.md +1 -1
  113. package/plugins/src/base/rules/reference/config-resolution.md +4 -3
  114. package/plugins/src/base/rules/reference/pre-flight-autofill.md +3 -3
  115. package/plugins/src/base/skills/exploratory-qa/SKILL.md +91 -0
  116. package/plugins/src/base/skills/implement/SKILL.md +1 -1
  117. package/plugins/src/base/skills/product-walkthrough/SKILL.md +36 -61
  118. package/plugins/src/base/skills/use-the-product/SKILL.md +86 -0
  119. package/plugins/src/expo/commands/e2e-coverage-gaps.md +1 -1
  120. package/plugins/src/harper-fabric/commands/e2e-coverage-gaps.md +1 -1
  121. package/plugins/src/rails/commands/e2e-coverage-gaps.md +1 -1
  122. package/plugins/lisa-expo/commands/exploratory-qa.md +0 -7
  123. package/plugins/lisa-expo/skills/exploratory-qa/SKILL.md +0 -264
  124. package/plugins/lisa-expo/skills/exploratory-qa/agents/openai.yaml +0 -4
  125. package/plugins/lisa-expo-agy/commands/exploratory-qa.md +0 -7
  126. package/plugins/lisa-expo-agy/skills/exploratory-qa/SKILL.md +0 -264
  127. package/plugins/lisa-expo-copilot/commands/exploratory-qa.md +0 -7
  128. package/plugins/lisa-expo-copilot/skills/exploratory-qa/SKILL.md +0 -264
  129. package/plugins/lisa-expo-cursor/commands/exploratory-qa.md +0 -7
  130. package/plugins/lisa-expo-cursor/skills/exploratory-qa/SKILL.md +0 -264
  131. package/plugins/lisa-harper-fabric/commands/exploratory-qa.md +0 -7
  132. package/plugins/lisa-harper-fabric/skills/exploratory-qa/SKILL.md +0 -264
  133. package/plugins/lisa-harper-fabric/skills/exploratory-qa/agents/openai.yaml +0 -4
  134. package/plugins/lisa-harper-fabric-agy/commands/exploratory-qa.md +0 -7
  135. package/plugins/lisa-harper-fabric-agy/skills/exploratory-qa/SKILL.md +0 -264
  136. package/plugins/lisa-harper-fabric-copilot/commands/exploratory-qa.md +0 -7
  137. package/plugins/lisa-harper-fabric-copilot/skills/exploratory-qa/SKILL.md +0 -264
  138. package/plugins/lisa-harper-fabric-cursor/commands/exploratory-qa.md +0 -7
  139. package/plugins/lisa-harper-fabric-cursor/skills/exploratory-qa/SKILL.md +0 -264
  140. package/plugins/lisa-rails/commands/exploratory-qa.md +0 -7
  141. package/plugins/lisa-rails/skills/exploratory-qa/SKILL.md +0 -264
  142. package/plugins/lisa-rails/skills/exploratory-qa/agents/openai.yaml +0 -4
  143. package/plugins/lisa-rails-agy/commands/exploratory-qa.md +0 -7
  144. package/plugins/lisa-rails-agy/skills/exploratory-qa/SKILL.md +0 -264
  145. package/plugins/lisa-rails-copilot/commands/exploratory-qa.md +0 -7
  146. package/plugins/lisa-rails-copilot/skills/exploratory-qa/SKILL.md +0 -264
  147. package/plugins/lisa-rails-cursor/commands/exploratory-qa.md +0 -7
  148. package/plugins/lisa-rails-cursor/skills/exploratory-qa/SKILL.md +0 -264
  149. package/plugins/src/expo/commands/exploratory-qa.md +0 -7
  150. package/plugins/src/expo/skills/exploratory-qa/SKILL.md +0 -264
  151. package/plugins/src/harper-fabric/commands/exploratory-qa.md +0 -7
  152. package/plugins/src/harper-fabric/skills/exploratory-qa/SKILL.md +0 -264
  153. package/plugins/src/rails/commands/exploratory-qa.md +0 -7
  154. 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-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-harper-fabric:exploratory-qa. $ARGUMENTS
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-rails:exploratory-qa. $ARGUMENTS
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,4 +0,0 @@
1
- display_name: "Exploratory QA"
2
- short_description: "First-time-user exploratory QA walkthrough for web apps that FEEDS THE LIFECYCLE"
3
- default_prompt:
4
- - "Use $exploratory-qa: First-time-user exploratory QA walkthrough for web apps that FEEDS THE LIFECYCLE."
@@ -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