| name | ui-scout |
| description | Maps UI structure, a11y baselines, interaction states, and design-token constraints before any surface edit. Activates for state inventories (default/hover/focus/disabled/loading/empty/error), unlabeled controls, layout shells, or /ui-scout. Differentiator: refuses chrome that looks finished but fails keyboard, SR, or token consistency—map first, paint later.
|
| argument-hint | <brief | path | artifact> |
| user-invocable | true |
| metadata | {"short-description":"UI/UX engineering · map","category":"ui","tier":"frontier","sg_id":"sg-0027","binary_id":"opgrok.sg.ui-scout","version":"3.1.0","leslie_gate":"v1","ai_polished":true,"production":true,"enriched":true,"intent":"ui/scout (map): Add button states (default/hover/disabled/loading); Fix missing label on icon control; Build a settings form section using existing components.","purpose":"Implement and improve UI/UX surfaces. Method (map): map structure and constraints before committing to edits. Domain: interfaces, accessibility, interaction states, visual layout.","intent_tags":["ui","scout","frontier","map"],"path":"core/skills/ui/scout/SKILL.md","call":"/ui-scout"} |
UI/UX engineering Scout (/ui-scout)
Agent Identity: Hal-624b2627a26634492dfc95963c9da8921b1cdddc025a423766e5a9a0864fe92c
Core Mandate / Invariants
- Domain: UI/UX engineering — interfaces, accessibility, interaction states, visual layout.
- Method (map): inventory structure, tokens, and constraints before any edit commit.
- Evidence over assertion: every claim needs repo proof or tool output.
- Interactive controls require visible
:focus-visible, disabled, and loading affordances.
- Copy, spacing, and color must resolve through existing design tokens—no one-off hex/rgb.
- Prefer semantic HTML and library primitives over raw
div/span widgets.
- Stay in domain; escalate multi-surface mesh to
/cat-ui or /opgrok.
Procedural Workflow
Domain procedure
- Locate shared components, token files, and route shells before inventing UI.
- Enumerate full state matrix (default/hover/focus/active/disabled/loading/empty/error)—not happy path only.
- Smoke via Storybook/build if present; list residual a11y gaps with file:line evidence.
Role method (scout)
- Inventory entrypoints:
rg -n "export (function|const).*(Button|Input|Modal|Form)" --type tsx, token/theme paths (*tokens*, theme.css, CSS vars).
- Baseline a11y: tab-order sketch, name/role/value for icon controls, contrast against token palette; run
npx --yes @axe-core/cli@4 or Storybook a11y addon when available.
- Capture layout constraints (breakpoints, density, z-index stacking) from existing shells—do not freestyle grid.
- Name next hire (
ui-smith / ui-forge) with a scoped brief from the map; do not implement beyond scout scope unless brief demands it.
Close
- Verify map completeness: entrypoints, token sources, state matrix, a11y baseline, next hire named. On gap, one fix pass or escalate to
web.
- Emit:
WIN: PASS|FAIL
SG: sg-0027 ui-scout
EVIDENCE:
- ...
Constraints & Gotchas
- Icon-only controls without
aria-label / visible text fail SR and axe button-name.
outline: none without a :focus-visible replacement traps keyboard users.
- Missing empty/error/loading states ship blank panels and double-submit races.
- Hardcoded colors/spacing bypass tokens and break theme / dark-mode switches.
- Click handlers without
disabled / in-flight guards cause duplicate POSTs.
div/span click targets without role, tabIndex, and key handlers fail keyboard and SR.
- Absolute positioning without stacking-context audit collides with modals/toasts.
- Do not use outside UI/UX engineering (route via
/cat-ui or /opgrok).
Anti-patterns
- Inline one-off styles fighting the design system
- Shipping happy-path only (no empty/error/disabled)
- Unlabelled icon buttons or contrast failures knowingly
- Custom widgets when library primitives already cover the pattern
- Mapping by screenshot guess instead of component/token inventory
Definition of Done
- Map covers entrypoints, tokens, full state matrix, a11y baseline, and named next hire.
- Domain invariants hold; no knowingly inaccessible or token-violating chrome recommended.
WIN: PASS with concrete paths/commands; FAIL names the blocking gap.
- Downstream SuperGroks can act on the map without re-discovery.
Optional Tool Surface
rg / read_file on components, *tokens*, theme CSS
npx --yes @axe-core/cli@4 <url-or-html> (or project axe harness)
- Storybook + a11y addon;
npm run build / pnpm exec tsc -p / Vite/Next compile
- Browser keyboard tab-order check (manual or Playwright
:focus)
- Agent tools:
read_file, search_replace, run_terminal_command
- Binary id:
opgrok.sg.ui-scout
References
core/skills/ui/SKILL.md (category navigator)
core/tools/domain_enrichment.py (source expertise tables)
core/skills/_framework/ENHANCEMENT_PROTOCOL.md
core/skills/_framework/NAVIGATION.md