niahere 0.2.60 → 0.2.62

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 (183) hide show
  1. package/defaults/memory-promoter.md +99 -0
  2. package/defaults/self/staging.md +48 -0
  3. package/package.json +1 -1
  4. package/skills/code-review/pr-review.md +14 -1
  5. package/skills/cro/page.md +22 -0
  6. package/skills/frontend-design/SKILL.md +7 -3
  7. package/skills/frontend-design/building.md +17 -2
  8. package/skills/qa/SKILL.md +108 -72
  9. package/skills/userinterface-wiki/AGENTS.md +3749 -0
  10. package/skills/userinterface-wiki/SKILL.md +253 -0
  11. package/skills/userinterface-wiki/metadata.json +26 -0
  12. package/skills/userinterface-wiki/rules/_sections.md +66 -0
  13. package/skills/userinterface-wiki/rules/_template.md +24 -0
  14. package/skills/userinterface-wiki/rules/a11y-reduced-motion-check.md +30 -0
  15. package/skills/userinterface-wiki/rules/a11y-toggle-setting.md +30 -0
  16. package/skills/userinterface-wiki/rules/a11y-visual-equivalent.md +36 -0
  17. package/skills/userinterface-wiki/rules/a11y-volume-control.md +28 -0
  18. package/skills/userinterface-wiki/rules/appropriate-confirmations-only.md +19 -0
  19. package/skills/userinterface-wiki/rules/appropriate-errors-warnings.md +18 -0
  20. package/skills/userinterface-wiki/rules/appropriate-no-decorative.md +21 -0
  21. package/skills/userinterface-wiki/rules/appropriate-no-high-frequency.md +28 -0
  22. package/skills/userinterface-wiki/rules/appropriate-no-punishing.md +27 -0
  23. package/skills/userinterface-wiki/rules/container-callback-ref.md +31 -0
  24. package/skills/userinterface-wiki/rules/container-guard-initial-zero.md +25 -0
  25. package/skills/userinterface-wiki/rules/container-no-excessive-use.md +13 -0
  26. package/skills/userinterface-wiki/rules/container-overflow-hidden.md +25 -0
  27. package/skills/userinterface-wiki/rules/container-transition-delay.md +21 -0
  28. package/skills/userinterface-wiki/rules/container-two-div-pattern.md +35 -0
  29. package/skills/userinterface-wiki/rules/container-use-resize-observer.md +48 -0
  30. package/skills/userinterface-wiki/rules/context-cleanup-nodes.md +25 -0
  31. package/skills/userinterface-wiki/rules/context-resume-suspended.md +28 -0
  32. package/skills/userinterface-wiki/rules/context-reuse-single.md +30 -0
  33. package/skills/userinterface-wiki/rules/design-filter-for-character.md +25 -0
  34. package/skills/userinterface-wiki/rules/design-noise-for-percussion.md +26 -0
  35. package/skills/userinterface-wiki/rules/design-oscillator-for-tonal.md +22 -0
  36. package/skills/userinterface-wiki/rules/duration-max-300ms.md +21 -0
  37. package/skills/userinterface-wiki/rules/duration-press-hover.md +21 -0
  38. package/skills/userinterface-wiki/rules/duration-shorten-before-curve.md +21 -0
  39. package/skills/userinterface-wiki/rules/duration-small-state.md +15 -0
  40. package/skills/userinterface-wiki/rules/easing-entrance-ease-out.md +21 -0
  41. package/skills/userinterface-wiki/rules/easing-exit-ease-in.md +21 -0
  42. package/skills/userinterface-wiki/rules/easing-for-state-change.md +27 -0
  43. package/skills/userinterface-wiki/rules/easing-linear-only-progress.md +21 -0
  44. package/skills/userinterface-wiki/rules/easing-natural-decay.md +22 -0
  45. package/skills/userinterface-wiki/rules/easing-no-linear-motion.md +22 -0
  46. package/skills/userinterface-wiki/rules/easing-transition-ease-in-out.md +15 -0
  47. package/skills/userinterface-wiki/rules/envelope-exponential-decay.md +21 -0
  48. package/skills/userinterface-wiki/rules/envelope-no-zero-target.md +21 -0
  49. package/skills/userinterface-wiki/rules/envelope-set-initial-value.md +22 -0
  50. package/skills/userinterface-wiki/rules/exit-key-required.md +29 -0
  51. package/skills/userinterface-wiki/rules/exit-matches-initial.md +29 -0
  52. package/skills/userinterface-wiki/rules/exit-prop-required.md +33 -0
  53. package/skills/userinterface-wiki/rules/exit-requires-wrapper.md +27 -0
  54. package/skills/userinterface-wiki/rules/impl-default-subtle.md +21 -0
  55. package/skills/userinterface-wiki/rules/impl-preload-audio.md +34 -0
  56. package/skills/userinterface-wiki/rules/impl-reset-current-time.md +26 -0
  57. package/skills/userinterface-wiki/rules/mode-pop-layout-for-lists.md +25 -0
  58. package/skills/userinterface-wiki/rules/mode-sync-layout-conflict.md +29 -0
  59. package/skills/userinterface-wiki/rules/mode-wait-doubles-duration.md +25 -0
  60. package/skills/userinterface-wiki/rules/morphing-aria-hidden.md +21 -0
  61. package/skills/userinterface-wiki/rules/morphing-consistent-viewbox.md +23 -0
  62. package/skills/userinterface-wiki/rules/morphing-group-variants.md +33 -0
  63. package/skills/userinterface-wiki/rules/morphing-jump-non-grouped.md +29 -0
  64. package/skills/userinterface-wiki/rules/morphing-reduced-motion.md +28 -0
  65. package/skills/userinterface-wiki/rules/morphing-spring-rotation.md +23 -0
  66. package/skills/userinterface-wiki/rules/morphing-strokelinecap-round.md +21 -0
  67. package/skills/userinterface-wiki/rules/morphing-three-lines.md +32 -0
  68. package/skills/userinterface-wiki/rules/morphing-use-collapsed.md +33 -0
  69. package/skills/userinterface-wiki/rules/native-backdrop-styling.md +27 -0
  70. package/skills/userinterface-wiki/rules/native-placeholder-styling.md +27 -0
  71. package/skills/userinterface-wiki/rules/native-selection-styling.md +18 -0
  72. package/skills/userinterface-wiki/rules/nested-consistent-timing.md +25 -0
  73. package/skills/userinterface-wiki/rules/nested-propagate-required.md +41 -0
  74. package/skills/userinterface-wiki/rules/none-context-menu-entrance.md +25 -0
  75. package/skills/userinterface-wiki/rules/none-high-frequency.md +29 -0
  76. package/skills/userinterface-wiki/rules/none-keyboard-navigation.md +32 -0
  77. package/skills/userinterface-wiki/rules/param-click-duration.md +21 -0
  78. package/skills/userinterface-wiki/rules/param-filter-frequency-range.md +21 -0
  79. package/skills/userinterface-wiki/rules/param-q-value-range.md +21 -0
  80. package/skills/userinterface-wiki/rules/param-reasonable-gain.md +21 -0
  81. package/skills/userinterface-wiki/rules/physics-active-state.md +23 -0
  82. package/skills/userinterface-wiki/rules/physics-no-excessive-stagger.md +22 -0
  83. package/skills/userinterface-wiki/rules/physics-spring-for-overshoot.md +23 -0
  84. package/skills/userinterface-wiki/rules/physics-subtle-deformation.md +22 -0
  85. package/skills/userinterface-wiki/rules/prefetch-hit-slop.md +27 -0
  86. package/skills/userinterface-wiki/rules/prefetch-keyboard-tab.md +19 -0
  87. package/skills/userinterface-wiki/rules/prefetch-not-everything.md +22 -0
  88. package/skills/userinterface-wiki/rules/prefetch-touch-fallback.md +34 -0
  89. package/skills/userinterface-wiki/rules/prefetch-trajectory-over-hover.md +32 -0
  90. package/skills/userinterface-wiki/rules/prefetch-use-selectively.md +13 -0
  91. package/skills/userinterface-wiki/rules/presence-disable-interactions.md +31 -0
  92. package/skills/userinterface-wiki/rules/presence-hook-in-child.md +31 -0
  93. package/skills/userinterface-wiki/rules/presence-safe-to-remove.md +37 -0
  94. package/skills/userinterface-wiki/rules/pseudo-content-required.md +28 -0
  95. package/skills/userinterface-wiki/rules/pseudo-first-line-styling.md +27 -0
  96. package/skills/userinterface-wiki/rules/pseudo-hit-target-expansion.md +31 -0
  97. package/skills/userinterface-wiki/rules/pseudo-marker-styling.md +28 -0
  98. package/skills/userinterface-wiki/rules/pseudo-over-dom-node.md +32 -0
  99. package/skills/userinterface-wiki/rules/pseudo-position-relative-parent.md +33 -0
  100. package/skills/userinterface-wiki/rules/pseudo-z-index-layering.md +37 -0
  101. package/skills/userinterface-wiki/rules/spring-for-gestures.md +27 -0
  102. package/skills/userinterface-wiki/rules/spring-for-interruptible.md +27 -0
  103. package/skills/userinterface-wiki/rules/spring-params-balanced.md +29 -0
  104. package/skills/userinterface-wiki/rules/spring-preserves-velocity.md +28 -0
  105. package/skills/userinterface-wiki/rules/staging-dim-background.md +22 -0
  106. package/skills/userinterface-wiki/rules/staging-one-focal-point.md +24 -0
  107. package/skills/userinterface-wiki/rules/staging-z-index-hierarchy.md +22 -0
  108. package/skills/userinterface-wiki/rules/timing-consistent.md +24 -0
  109. package/skills/userinterface-wiki/rules/timing-no-entrance-context-menu.md +22 -0
  110. package/skills/userinterface-wiki/rules/timing-under-300ms.md +22 -0
  111. package/skills/userinterface-wiki/rules/transition-name-cleanup.md +28 -0
  112. package/skills/userinterface-wiki/rules/transition-name-required.md +27 -0
  113. package/skills/userinterface-wiki/rules/transition-name-unique.md +24 -0
  114. package/skills/userinterface-wiki/rules/transition-over-js-library.md +32 -0
  115. package/skills/userinterface-wiki/rules/transition-style-pseudo-elements.md +24 -0
  116. package/skills/userinterface-wiki/rules/type-antialiased-on-retina.md +18 -0
  117. package/skills/userinterface-wiki/rules/type-disambiguation-stylistic-set.md +15 -0
  118. package/skills/userinterface-wiki/rules/type-font-display-swap.md +28 -0
  119. package/skills/userinterface-wiki/rules/type-justify-with-hyphens.md +24 -0
  120. package/skills/userinterface-wiki/rules/type-letter-spacing-uppercase.md +28 -0
  121. package/skills/userinterface-wiki/rules/type-no-font-synthesis.md +18 -0
  122. package/skills/userinterface-wiki/rules/type-oldstyle-nums-for-prose.md +21 -0
  123. package/skills/userinterface-wiki/rules/type-opentype-contextual-alternates.md +15 -0
  124. package/skills/userinterface-wiki/rules/type-optical-sizing-auto.md +25 -0
  125. package/skills/userinterface-wiki/rules/type-proper-fractions.md +15 -0
  126. package/skills/userinterface-wiki/rules/type-slashed-zero.md +17 -0
  127. package/skills/userinterface-wiki/rules/type-tabular-nums-for-data.md +21 -0
  128. package/skills/userinterface-wiki/rules/type-text-wrap-balance-headings.md +21 -0
  129. package/skills/userinterface-wiki/rules/type-text-wrap-pretty.md +16 -0
  130. package/skills/userinterface-wiki/rules/type-underline-offset.md +25 -0
  131. package/skills/userinterface-wiki/rules/type-variable-weight-continuous.md +23 -0
  132. package/skills/userinterface-wiki/rules/ux-aesthetic-usability.md +32 -0
  133. package/skills/userinterface-wiki/rules/ux-cognitive-load-reduce.md +49 -0
  134. package/skills/userinterface-wiki/rules/ux-common-region-boundaries.md +50 -0
  135. package/skills/userinterface-wiki/rules/ux-doherty-perceived-speed.md +29 -0
  136. package/skills/userinterface-wiki/rules/ux-doherty-under-400ms.md +30 -0
  137. package/skills/userinterface-wiki/rules/ux-fitts-hit-area.md +32 -0
  138. package/skills/userinterface-wiki/rules/ux-fitts-target-size.md +31 -0
  139. package/skills/userinterface-wiki/rules/ux-goal-gradient-progress.md +33 -0
  140. package/skills/userinterface-wiki/rules/ux-hicks-minimize-choices.md +45 -0
  141. package/skills/userinterface-wiki/rules/ux-jakobs-familiar-patterns.md +37 -0
  142. package/skills/userinterface-wiki/rules/ux-millers-chunking.md +23 -0
  143. package/skills/userinterface-wiki/rules/ux-pareto-prioritize-features.md +36 -0
  144. package/skills/userinterface-wiki/rules/ux-peak-end-finish-strong.md +35 -0
  145. package/skills/userinterface-wiki/rules/ux-postels-accept-messy-input.md +45 -0
  146. package/skills/userinterface-wiki/rules/ux-pragnanz-simplify.md +33 -0
  147. package/skills/userinterface-wiki/rules/ux-progressive-disclosure.md +41 -0
  148. package/skills/userinterface-wiki/rules/ux-proximity-grouping.md +38 -0
  149. package/skills/userinterface-wiki/rules/ux-serial-position.md +31 -0
  150. package/skills/userinterface-wiki/rules/ux-similarity-consistency.md +35 -0
  151. package/skills/userinterface-wiki/rules/ux-teslers-complexity.md +28 -0
  152. package/skills/userinterface-wiki/rules/ux-uniform-connectedness.md +43 -0
  153. package/skills/userinterface-wiki/rules/ux-von-restorff-emphasis.md +29 -0
  154. package/skills/userinterface-wiki/rules/ux-zeigarnik-show-incomplete.md +36 -0
  155. package/skills/userinterface-wiki/rules/visual-animate-shadow-pseudo.md +49 -0
  156. package/skills/userinterface-wiki/rules/visual-border-alpha-colors.md +25 -0
  157. package/skills/userinterface-wiki/rules/visual-button-shadow-anatomy.md +49 -0
  158. package/skills/userinterface-wiki/rules/visual-concentric-radius.md +40 -0
  159. package/skills/userinterface-wiki/rules/visual-consistent-spacing-scale.md +35 -0
  160. package/skills/userinterface-wiki/rules/visual-layered-shadows.md +30 -0
  161. package/skills/userinterface-wiki/rules/visual-no-pure-black-shadow.md +25 -0
  162. package/skills/userinterface-wiki/rules/visual-shadow-direction.md +25 -0
  163. package/skills/userinterface-wiki/rules/visual-shadow-matches-elevation.md +23 -0
  164. package/skills/userinterface-wiki/rules/weight-duration-matches-action.md +29 -0
  165. package/skills/userinterface-wiki/rules/weight-match-action.md +32 -0
  166. package/src/channels/slack.ts +89 -38
  167. package/src/chat/engine.ts +20 -53
  168. package/src/chat/repl.ts +4 -3
  169. package/src/cli/watch.ts +15 -10
  170. package/src/commands/init.ts +51 -23
  171. package/src/commands/validate.ts +12 -10
  172. package/src/core/consolidator.ts +106 -86
  173. package/src/core/daemon.ts +116 -6
  174. package/src/core/finalizer.ts +125 -0
  175. package/src/core/runner.ts +13 -43
  176. package/src/db/migrations/014_finalization_requests.ts +21 -0
  177. package/src/mcp/server.ts +30 -101
  178. package/src/mcp/tools.ts +23 -69
  179. package/src/types/config.ts +8 -1
  180. package/src/types/paths.ts +1 -0
  181. package/src/utils/config.ts +48 -44
  182. package/src/utils/paths.ts +1 -0
  183. package/src/utils/watches.ts +68 -0
@@ -31,19 +31,20 @@ For Playwright MCP reference, see [playwright.md](playwright.md)
31
31
 
32
32
  **Parse the user's request for these parameters:**
33
33
 
34
- | Parameter | Default | Override example |
35
- |-----------|---------|-----------------|
34
+ | Parameter | Default | Override example |
35
+ | ---------- | ------------------------- | -------------------------------------------- |
36
36
  | Target URL | (auto-detect or required) | `https://myapp.com`, `http://localhost:3000` |
37
- | Mode | full | `--quick`, `--regression baseline.json` |
38
- | Output dir | `.qa-reports/` | `Output to /tmp/qa` |
39
- | Scope | Full app (or diff-scoped) | `Focus on the billing page` |
40
- | Auth | None | `Sign in to user@example.com` |
37
+ | Mode | full | `--quick`, `--regression baseline.json` |
38
+ | Output dir | `.qa-reports/` | `Output to /tmp/qa` |
39
+ | Scope | Full app (or diff-scoped) | `Focus on the billing page` |
40
+ | Auth | None | `Sign in to user@example.com` |
41
41
 
42
42
  **If no URL is given and you're on a feature branch:** Automatically enter **diff-aware mode**.
43
43
 
44
44
  **Determine the browser automation tool:**
45
45
 
46
46
  Check in this order:
47
+
47
48
  1. **Playwright MCP tools** — check if `mcp__plugin_playwright_playwright__browser_navigate` is available as a tool. If yes, use Playwright MCP tools (preferred).
48
49
  2. **Playwright CLI** — check if `npx playwright` works. If yes, write and run Playwright scripts.
49
50
  3. **Neither available** — tell the user: "No browser automation available. Install Playwright (`npx playwright install chromium`) or ensure Playwright MCP is configured."
@@ -62,32 +63,35 @@ mkdir -p "$REPORT_DIR/screenshots"
62
63
  This skill works with whatever Playwright is available. Here's the mapping:
63
64
 
64
65
  ### Using Playwright MCP tools (preferred)
65
- | Action | Tool |
66
- |--------|------|
67
- | Navigate | `browser_navigate` with url |
68
- | Click | `browser_click` with selector or ref |
69
- | Fill form | `browser_fill_form` with field data |
70
- | Take screenshot | `browser_take_screenshot` |
71
- | Get page snapshot | `browser_snapshot` |
72
- | Check console | `browser_console_messages` |
73
- | Run JS | `browser_evaluate` with script |
74
- | Wait for element | `browser_wait_for` with selector |
75
- | Resize viewport | `browser_resize` with width/height |
76
- | Press key | `browser_press_key` with key |
77
- | Hover | `browser_hover` with selector |
78
- | Handle dialog | `browser_handle_dialog` |
79
- | Upload file | `browser_file_upload` with paths |
80
- | Check network | `browser_network_requests` |
66
+
67
+ | Action | Tool |
68
+ | ----------------- | ------------------------------------ |
69
+ | Navigate | `browser_navigate` with url |
70
+ | Click | `browser_click` with selector or ref |
71
+ | Fill form | `browser_fill_form` with field data |
72
+ | Take screenshot | `browser_take_screenshot` |
73
+ | Get page snapshot | `browser_snapshot` |
74
+ | Check console | `browser_console_messages` |
75
+ | Run JS | `browser_evaluate` with script |
76
+ | Wait for element | `browser_wait_for` with selector |
77
+ | Resize viewport | `browser_resize` with width/height |
78
+ | Press key | `browser_press_key` with key |
79
+ | Hover | `browser_hover` with selector |
80
+ | Handle dialog | `browser_handle_dialog` |
81
+ | Upload file | `browser_file_upload` with paths |
82
+ | Check network | `browser_network_requests` |
81
83
 
82
84
  ### Using Playwright CLI (fallback)
85
+
83
86
  Write a Node.js script using Playwright API and run it via `node /tmp/qa-script.js`. Script pattern:
87
+
84
88
  ```javascript
85
- const { chromium } = require('playwright');
89
+ const { chromium } = require("playwright");
86
90
  (async () => {
87
91
  const browser = await chromium.launch();
88
- const page = await browser.newContext().then(c => c.newPage());
89
- await page.goto('TARGET_URL');
90
- await page.screenshot({ path: '/tmp/screenshot.png', fullPage: true });
92
+ const page = await browser.newContext().then((c) => c.newPage());
93
+ await page.goto("TARGET_URL");
94
+ await page.screenshot({ path: "/tmp/screenshot.png", fullPage: true });
91
95
  // ... interactions ...
92
96
  await browser.close();
93
97
  })();
@@ -100,6 +104,7 @@ const { chromium } = require('playwright');
100
104
  ### Diff-aware (automatic when on a feature branch with no URL)
101
105
 
102
106
  1. **Analyze the branch diff:**
107
+
103
108
  ```bash
104
109
  git diff main...HEAD --name-only
105
110
  git log main..HEAD --oneline
@@ -114,12 +119,14 @@ const { chromium } = require('playwright');
114
119
  - Static pages -> navigate to them directly
115
120
 
116
121
  3. **Detect the running app** — check common local dev ports:
122
+
117
123
  ```bash
118
124
  lsof -i :3000 2>/dev/null && echo "Found app on :3000" || \
119
125
  lsof -i :4000 2>/dev/null && echo "Found app on :4000" || \
120
126
  lsof -i :5173 2>/dev/null && echo "Found app on :5173" || \
121
127
  lsof -i :8080 2>/dev/null && echo "Found app on :8080"
122
128
  ```
129
+
123
130
  If nothing found, ask the user for the URL.
124
131
 
125
132
  4. **Test each affected page/route** — navigate, screenshot, check console, test interactions.
@@ -129,13 +136,17 @@ const { chromium } = require('playwright');
129
136
  6. **Report findings** scoped to the branch changes.
130
137
 
131
138
  ### Full (default when URL is provided)
139
+
132
140
  Systematic exploration. Visit every reachable page. Document 5-10 well-evidenced issues. Produce health score. Takes 5-15 minutes.
133
141
 
134
142
  ### Quick (`--quick`)
143
+
135
144
  30-second smoke test. Homepage + top 5 navigation targets. Check: loads? Console errors? Broken links? Health score. No detailed issue docs.
136
145
 
137
146
  ### Single-page (`--single`)
147
+
138
148
  Verify one page or component. Navigate, screenshot, check console errors, test interactive elements, report. Use when the user says "check if this works", "verify this page", "test this component", or provides a single URL with a focused ask. No health score — just a pass/fail checklist:
149
+
139
150
  1. Page loads without errors
140
151
  2. Screenshot looks correct (describe what you see)
141
152
  3. Console is clean (or list errors)
@@ -143,6 +154,7 @@ Verify one page or component. Navigate, screenshot, check console errors, test i
143
154
  5. Accessibility snapshot has no obvious issues
144
155
 
145
156
  ### Regression (`--regression <baseline>`)
157
+
146
158
  Run full mode, then load baseline JSON. Diff: which issues fixed? Which new? Score delta?
147
159
 
148
160
  ---
@@ -150,24 +162,29 @@ Run full mode, then load baseline JSON. Diff: which issues fixed? Which new? Sco
150
162
  ## Workflow
151
163
 
152
164
  ### Phase 1: Initialize
165
+
153
166
  1. Determine browser automation tool
154
167
  2. Create output directories
155
168
  3. Start timer for duration tracking
156
169
 
157
170
  ### Phase 2: Authenticate (if needed)
171
+
158
172
  Navigate to login page, fill credentials, submit. NEVER include real passwords in reports — write `[REDACTED]`.
159
173
 
160
174
  If 2FA/OTP required: ask the user for the code.
161
175
  If CAPTCHA blocks: tell the user to complete it manually.
162
176
 
163
177
  ### Phase 3: Orient
178
+
164
179
  Get a map of the application:
180
+
165
181
  - Navigate to target URL
166
182
  - Take screenshot of landing page
167
183
  - Get page snapshot to map navigation structure
168
184
  - Check console for errors
169
185
 
170
186
  **Detect framework** (note in report):
187
+
171
188
  - `__next` or `_next/data` -> Next.js
172
189
  - `csrf-token` meta tag -> Rails
173
190
  - `wp-content` -> WordPress
@@ -176,12 +193,15 @@ Get a map of the application:
176
193
  **For SPAs:** Use page snapshot to find nav elements instead of link enumeration.
177
194
 
178
195
  ### Phase 4: Explore
196
+
179
197
  Visit pages systematically. At each page:
198
+
180
199
  1. Navigate to page
181
200
  2. Take screenshot
182
201
  3. Check console for errors
183
202
 
184
203
  Then follow the **per-page exploration checklist:**
204
+
185
205
  1. **Visual scan** — Look at screenshot for layout issues
186
206
  2. **Interactive elements** — Click buttons, links, controls. Do they work?
187
207
  3. **Forms** — Fill and submit. Test empty, invalid, edge cases
@@ -195,6 +215,7 @@ Spend more time on core features, less on secondary pages.
195
215
  **Quick mode:** Only homepage + top 5 nav targets. Just check: loads, console errors, broken links.
196
216
 
197
217
  ### Phase 5: Document
218
+
198
219
  Document each issue **immediately when found**.
199
220
 
200
221
  **Interactive bugs:** Screenshot before action, perform action, screenshot after, describe what changed.
@@ -202,6 +223,7 @@ Document each issue **immediately when found**.
202
223
  **Static bugs:** Single screenshot showing the problem + description.
203
224
 
204
225
  ### Phase 6: Wrap Up
226
+
205
227
  1. Compute health score (see rubric below)
206
228
  2. Write "Top 3 Things to Fix"
207
229
  3. Console health summary
@@ -214,14 +236,16 @@ Document each issue **immediately when found**.
214
236
  ## Issue Taxonomy
215
237
 
216
238
  ### Severity Levels
217
- | Severity | Definition |
218
- |----------|------------|
219
- | **critical** | Blocks a core workflow, causes data loss, or crashes the app |
220
- | **high** | Major feature broken or unusable, no workaround |
221
- | **medium** | Feature works but with noticeable problems, workaround exists |
222
- | **low** | Minor cosmetic or polish issue |
239
+
240
+ | Severity | Definition |
241
+ | ------------ | ------------------------------------------------------------- |
242
+ | **critical** | Blocks a core workflow, causes data loss, or crashes the app |
243
+ | **high** | Major feature broken or unusable, no workaround |
244
+ | **medium** | Feature works but with noticeable problems, workaround exists |
245
+ | **low** | Minor cosmetic or polish issue |
223
246
 
224
247
  ### Categories
248
+
225
249
  1. **Visual/UI** — Layout breaks, broken images, z-index, font/color issues, animation glitches
226
250
  2. **Functional** — Broken links, dead buttons, form validation, incorrect redirects, state issues, race conditions
227
251
  3. **UX** — Confusing nav, missing loading indicators, slow interactions, unclear errors, dead ends
@@ -230,6 +254,8 @@ Document each issue **immediately when found**.
230
254
  6. **Console/Errors** — JS exceptions, failed requests, deprecation warnings, CORS, mixed content
231
255
  7. **Accessibility** — Missing alt text, unlabeled inputs, keyboard nav broken, focus traps, contrast
232
256
 
257
+ **Grading Visual/UI and UX issues:** When you spot animation, easing, timing, focus, hit-target, shadow, radius, or typography problems, grade them against the [userinterface-wiki](../userinterface-wiki/SKILL.md) skill's 152 rules and cite the violated rule ID in the issue (e.g. "violates `timing-under-300ms`", "violates `ux-fitts-target-size`", "violates `visual-concentric-radius`"). This turns vague "feels off" findings into concrete, fixable diagnoses.
258
+
233
259
  ---
234
260
 
235
261
  ## Health Score Rubric
@@ -239,18 +265,20 @@ Each category score (0-100), weighted average.
239
265
  - Critical issue: -25, High: -15, Medium: -8, Low: -3 (per category, minimum 0)
240
266
 
241
267
  ### Weights
242
- | Category | Weight |
243
- |----------|--------|
244
- | Console | 15% |
245
- | Links | 10% |
246
- | Visual | 10% |
247
- | Functional | 20% |
248
- | UX | 15% |
249
- | Performance | 10% |
250
- | Content | 5% |
251
- | Accessibility | 15% |
268
+
269
+ | Category | Weight |
270
+ | ------------- | ------ |
271
+ | Console | 15% |
272
+ | Links | 10% |
273
+ | Visual | 10% |
274
+ | Functional | 20% |
275
+ | UX | 15% |
276
+ | Performance | 10% |
277
+ | Content | 5% |
278
+ | Accessibility | 15% |
252
279
 
253
280
  ### Console scoring: 0 errors=100, 1-3=70, 4-10=40, 10+=10
281
+
254
282
  ### Links scoring: 0 broken=100, each broken link: -15
255
283
 
256
284
  ---
@@ -260,59 +288,64 @@ Each category score (0-100), weighted average.
260
288
  ```markdown
261
289
  # QA Report: {APP_NAME}
262
290
 
263
- | Field | Value |
264
- |-------|-------|
265
- | **Date** | {DATE} |
266
- | **URL** | {URL} |
267
- | **Scope** | {SCOPE or "Full app"} |
268
- | **Mode** | {full / quick / diff-aware / regression} |
269
- | **Duration** | {DURATION} |
270
- | **Pages visited** | {COUNT} |
271
- | **Screenshots** | {COUNT} |
272
- | **Framework** | {DETECTED or "Unknown"} |
291
+ | Field | Value |
292
+ | ----------------- | ---------------------------------------- |
293
+ | **Date** | {DATE} |
294
+ | **URL** | {URL} |
295
+ | **Scope** | {SCOPE or "Full app"} |
296
+ | **Mode** | {full / quick / diff-aware / regression} |
297
+ | **Duration** | {DURATION} |
298
+ | **Pages visited** | {COUNT} |
299
+ | **Screenshots** | {COUNT} |
300
+ | **Framework** | {DETECTED or "Unknown"} |
273
301
 
274
302
  ## Health Score: {SCORE}/100
275
303
 
276
- | Category | Score |
277
- |----------|-------|
278
- | Console | {0-100} |
279
- | Links | {0-100} |
280
- | Visual | {0-100} |
281
- | Functional | {0-100} |
282
- | UX | {0-100} |
283
- | Performance | {0-100} |
304
+ | Category | Score |
305
+ | ------------- | ------- |
306
+ | Console | {0-100} |
307
+ | Links | {0-100} |
308
+ | Visual | {0-100} |
309
+ | Functional | {0-100} |
310
+ | UX | {0-100} |
311
+ | Performance | {0-100} |
284
312
  | Accessibility | {0-100} |
285
313
 
286
314
  ## Top 3 Things to Fix
315
+
287
316
  1. **{ISSUE-NNN}: {title}** — {one-line description}
288
317
  2. ...
289
318
  3. ...
290
319
 
291
320
  ## Console Health
292
- | Error | Count | First seen |
293
- |-------|-------|------------|
294
- | {error message} | {N} | {URL} |
321
+
322
+ | Error | Count | First seen |
323
+ | --------------- | ----- | ---------- |
324
+ | {error message} | {N} | {URL} |
295
325
 
296
326
  ## Summary
327
+
297
328
  | Severity | Count |
298
- |----------|-------|
299
- | Critical | 0 |
300
- | High | 0 |
301
- | Medium | 0 |
302
- | Low | 0 |
329
+ | -------- | ----- |
330
+ | Critical | 0 |
331
+ | High | 0 |
332
+ | Medium | 0 |
333
+ | Low | 0 |
303
334
 
304
335
  ## Issues
305
336
 
306
337
  ### ISSUE-001: {Short title}
307
- | Field | Value |
308
- |-------|-------|
309
- | **Severity** | critical / high / medium / low |
338
+
339
+ | Field | Value |
340
+ | ------------ | -------------------------------------------------------------------------- |
341
+ | **Severity** | critical / high / medium / low |
310
342
  | **Category** | visual / functional / ux / content / performance / console / accessibility |
311
- | **URL** | {page URL} |
343
+ | **URL** | {page URL} |
312
344
 
313
345
  **Description:** {What is wrong, expected vs actual.}
314
346
 
315
347
  **Repro Steps:**
348
+
316
349
  1. Navigate to {URL}
317
350
  2. {Action}
318
351
  3. **Observe:** {what goes wrong}
@@ -323,17 +356,20 @@ Each category score (0-100), weighted average.
323
356
  ## Framework-Specific Guidance
324
357
 
325
358
  ### Next.js
359
+
326
360
  - Check for hydration errors in console
327
361
  - Monitor `_next/data` requests — 404s = broken data fetching
328
362
  - Test client-side navigation (click links, don't just navigate) — catches routing issues
329
363
  - Check for CLS on pages with dynamic content
330
364
 
331
365
  ### Rails
366
+
332
367
  - Check for N+1 query warnings in console (dev mode)
333
368
  - Verify CSRF token presence in forms
334
369
  - Test Turbo/Stimulus integration
335
370
 
336
371
  ### SPA (React, Vue, Angular)
372
+
337
373
  - Use page snapshot for navigation — link enumeration misses client-side routes
338
374
  - Check for stale state (navigate away and back)
339
375
  - Test browser back/forward